关于BooleanQuery 的score算法

2020-08-19  本文已影响0人  不怕天黑_0819

在知道输入查询对应的是哪个字段的时候,我们可以使用booleanQuery来实现复杂查询语句。

布尔查询采用"匹配越多越好(More-matches-is-better)"的方法,所以每个match子句的得分会被加起来变成最后的每个文档的得分。匹配两个子句的文档的得分会比只匹配了一个文档的得分高。

但是should的写法直接影响了数据的评分规则,有可能会导致最终的推荐不准确。

bool查询是如何计算得到其分值的:

如下一个示例用来分析should语句的计算方式:

GET /_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "title":  "War and Peace" }},
        { "match": { "author": "Leo Tolstoy"   }},
        { "bool":  {
          "should": [
            { "match": { "translator": "Constance Garnett" }},
            { "match": { "translator": "Louise Maude"      }}
          ]
        }}
      ]
    }
  }
}

布尔查询执行每个匹配查询,把他们的得分加在一起,然后乘以匹配子句的数量,并且除以子句的总数。每个同级的子句权重是相同的。在前面的查询中,包含翻译者的布尔查询占用总得分的三分之一。如果我们把翻译者的子句放在和标题与作者同级的目录中,我们会把标题与作者的作用减少为四分之一。

当然我们可以通过"boost": 2 来为每一个should子句设置权重,一个合理boost值的范围在1和10之间,也可能是15。比它更高的值的影响不会起到很大的作用,因为分值会被规范化(Normalized)

上一篇 下一篇

猜你喜欢

热点阅读