es bool 查询是把任意多个简单查询组合在一起,使用 must、should、must_not、filter 选项来表示简单查询之间的逻辑,每个选项都可以出现 0 次到多次。它是为了满足现实中比较复杂的查询需求,如需要在多个字段上查询多种多样的文本,并且根据一系列的标准来过滤。
子选项
bool query 主要通过下列 4 个选项来构建用户想要的布尔查询,每个选项的含义如下:
must
:文档必须匹配,该选项下的查询条件,相当于逻辑运算的 AND,且参与文档相关度的评分。should
:文档可以匹配 should 选项下的查询条件也可以不匹配,相当于逻辑运算的 OR,且参与文档相关度的评分。must_not
:与 must 相反,匹配该选项下的查询条件的文档不会被返回;需要注意的是,must_not 语句不会影响评分,它的作用只是将不相关的文档排除。filter
:和 must 一样,匹配 filter 选项下的查询条件的文档才会被返回,但是 filter 不评分,只起到过滤功能,与 must_not 相反。
这里需要说明的是,每一个子查询都独自地计算文档的相关性得分。一旦他们的得分被计算出来, bool 查询就将这些得分进行合并并且返回一个代表整个布尔操作的得分。具体的得分规则在下面的评分计算章节中介绍。
GET books/_search
{
"query": {
"bool": {
"filter": {
"term": { "status": 1 }
},
"must_not": {
"range": { "price": { "gte": 70 } }
},
"must": {
"match": { "title": "java" }
},
"should": [
{
"match": { "description": "虚拟机" }
},
{
"match": { "content": "计算公式" }
}
]
}
}
}
控制精度
这里需要强调的是,must 语句必须匹配,但有多少 should 语句应该匹配呢?默认情况下,没有 should 语句是必须匹配的,但只有一个例外,那就是当没有 must 语句的时候,至少有一个 should 语句必须匹配。
此外我们可以通过 minimum_should_match 参数控制需要匹配的 should 语句的数量,关于 minimum_should_match 参数详解,可以参考 multi_match 详解 中解释。
计算规则
bool 查询采用“匹配越多越好(more_matches_is_better)”的机制,因此满足 must 和 should 子句的文档将会合并起来计算分值。
在 filter 子句查询中,分值将会都返回 0。
must_not 子句并不影响得分,它们存在的意义是排除已经被包含的文档。
如上所述,bool 查询的计算得分主要是 must 和 should 子句,它们的计算规则是,把所有符合 must 和 should 的子句得分加起来,然后乘以匹配子句的数量,再除以子句的总数。