# 四种常见的相关度分数优化方法
之前两节课,我觉得已经很了解整个 es 的相关度评分的算法了,算法思想,TF/IDF,vector model,boolean model; 实际的公式,query norm,query coordination,boost
对相关度评分进行调节和优化的常见的 4种方法
# query-time boost
提高权重
GET /forum/article/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"title": {
"query": "java spark",
"boost": 2
}
}
},
{
"match": {
"content": "java spark"
}
}
]
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
大致的校验查看,去掉 boost 和加上 boost 观察某几个 doc 的得分变化
# 重构查询结构
重构查询结果,在 es 新版本中,影响越来越小了。一般情况下,没什么必要的话,大家不用也行。
就是把下面查询中原本是所有的 match 都在第一个 should 中的,改写成下面的语句
GET /forum/article/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"content": "java"
}
},
{
"match": {
"content": "spark"
}
},
{
"bool": {
"should": [
{
"match": {
"content": "solution"
}
},
{
"match": {
"content": "beginner"
}
}
]
}
}
]
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# negative boost
举个例子:
搜索包含 java,不包含 spark 的 doc
但是这样子很死板,包含了 java 且 包含了 spark 的 doc 就会被过滤掉
GET /forum/article/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"content": "java"
}
}
],
"must_not": [
{
"match": {
"content": "spark"
}
}
]
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
搜索结果显示只有一条数据。
搜索包含 java,尽量不包含 spark 的 doc,如果包含了 spark,不会说排除掉这个 doc,而是说将这个 doc 的分数降低
GET /forum/article/_search
{
"query": {
"boosting": {
"positive": {
"match": {
"content": "java"
}
},
"negative": {
"match": {
"content": "spark"
}
},
"negative_boost": 0.2
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- positive:正向搜索
- negative:否定的搜索
- negative_boost:否定的权重
包含了 negative term 的 doc,分数乘以 negative boost ,分数降低
搜索结果显示有 5 条显示,但是不包含 spark 的那一个 doc 得分和使用 must_not 查询出来的得分是一样的, 其他的得分就很低很低
# constant_score
如果你压根儿不需要相关度评分,直接走 constant_score 加 filter,所有的 doc 分数都是 1,没有评分的概念了
GET /forum/article/_search
{
"query": {
"bool": {
"should": [
{
"constant_score": {
"query": {
"match": {
"title": "java"
}
}
}
},
{
"constant_score": {
"query": {
"match": {
"title": "spark"
}
}
}
}
]
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27