# 四种常见的相关度分数优化方法

之前两节课,我觉得已经很了解整个 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

大致的校验查看,去掉 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

# 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

搜索结果显示只有一条数据。

搜索包含 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
  • 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