美文网首页
关于BooleanQuery 的score算法

关于BooleanQuery 的score算法

作者: 不怕天黑_0819 | 来源:发表于2020-08-19 11:34 被阅读0次

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

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

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

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

  • 运行should子句中的查询
  • 相加查询返回的分值(关于每个查询的分值计算可自行回忆)
  • 将相加得到的分值乘以匹配的查询子句的数量
  • 除以总的查询子句的数量

如下一个示例用来分析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)

相关文章

网友评论

      本文标题:关于BooleanQuery 的score算法

      本文链接:https://www.haomeiwen.com/subject/ealkjktx.html