Elastic Search Bool详解

基本参数解释

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 子句,但它们不参与得分计算。

最终得分计算

文档的最终得分是以下两者的乘积:

  1. 从 must 子句中组合得到的得分(各个 must 子句的得分相乘)。
  2. 从 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,从而导致被过滤。

你可能感兴趣的:(Elasticsearch,数据库,elasticsearch)