目录
关于must + minimum_should_match匹配失效
基本参数解释
must
该子句(查询)必须出现在匹配的文档中,并将有助于得分。
filter
该子句(查询)必须出现在匹配的文档中。然而,与 must 不同,查询的得分将被忽略。Filter 子句在过滤器上下文中执行,这意味着会忽略得分,并考虑用于缓存的子句。
should
该子句(查询)应出现在匹配的文档中。
must_not
该子句(查询)不得出现在匹配的文档中。子句在过滤器上下文中执行,这意味着将忽略得分,并考虑用于缓存的子句。由于忽略得分,所有文档的得分将返回为0。
minimum_should_match
指定返回的文档必须匹配的 should 子句的数量或百分比。
根据上述参数解释,可以理解为,对分数贡献的主要来源于must和should,filter,must_not是直接对条件进行过滤,minimum_should_match是对should条件进行加强限制。
分数计算步骤
每个条件单独得分计算
布尔查询中的每个子句(must、should、must_not)都独立评估,为每个匹配的文档生成得分,must 和 should 子句基于词频和相关性因素生成得分;must_not 子句不生成得分,它们只是过滤掉文档。
合并得分
must
来自单个 must 条件的得分相互相乘,如果任何 must 条件匹配失败(得分为 0),整个文档的得分将为 0。
should
来自单个 should 子句的得分相加,如果没有 should 子句匹配,它们的组合得分将被视为 0。
minimum_should_match
强制至少要匹配的 should 子句的最小数量。如果文档未达到阈值,即使它匹配了 must 子句,也将得分为 0。
must_not
不直接影响得分计算,它们过滤掉符合 must_not 条件的文档,而不考虑来自其他子句的得分。
filter
在过滤方面类似于 must 子句,但它们不参与得分计算。
最终得分计算
文档的最终得分是以下两者的乘积:
- 从 must 子句中组合得到的得分(各个 must 子句的得分相乘)。
- 从 should 子句中组合得到的得分(匹配的 should 子句的得分相加,考虑 minimum_should_match)。
异常场景
关于must + minimum_should_match匹配失效
查询语句
{
"query": {
"bool": {
"must": [
{
"term": {
"condition1": true
}
}
],
"minimum_should_match": 1
}
}
}
匹配语句如上,即显示指定了must条件,且给定了 minimum_should_match 条件,但不包含should 条件,当去掉 minimum_should_match 条件的时候,能够匹配到数据,minimum_should_match不为0时候,无法匹配到数据
原理解释
当查询条件中没有指定should语句但又给定了minimum_should_match语句的时候,由于minimum_should_match只作用于should语句,ES执行的时候会补充一个空的should语句,其条件等效为在bool下添加了如下条件
"should": [],
根据之前的原理解释,should语句会计算内部各条件的分数和,这里计算的结果为0,在后续计算总分的时候,由于使用乘法方式,就算must能够匹配,最后分数依旧是0,从而导致被过滤。