在知道输入查询对应的是哪个字段的时候,我们可以使用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)。
网友评论