原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/query-dsl-bool-query.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/query-dsl-bool-query.html

bool 查询

匹配与其他查询的布尔(bool)组合相匹配的文档的查询。 bool 查询映射到 Lucene 的 BooleanQuery。 它使用一个或多个布尔子句构建,每个子句都有一个类型的出现。 出现的类型包括:

出现 描述

must

该子句(查询)必须出现在匹配的文档中,并且将参与计算得分。

filter

该子句(查询)必须出现在匹配的文档中。 然而,与 must 不同,该查询的分数将被忽略。 filter 子句在 filter 的上下文中执行,这意味着该字句的评分会被忽略,但会考虑对该字句进行缓存。

should

该子句(查询) 应该(should) 出现在匹配的文档中。

must_not

该子句(查询)不能出现在匹配的文档中。 该子句在 filter 的上下文中执行,这意味着该字句的评分会被忽略,但会考虑对该字句进行缓存。 因为评分被忽略,所以所有文档都返回0分。

bool 查询采用越匹配越好(more-matches-is-better)的方法,因此每个匹配的 mustshould 子句的分数将被加在一起,以提供每个文档的最终的_score

POST _search
{
  "query": {
    "bool" : {
      "must" : {
        "term" : { "user" : "kimchy" }
      },
      "filter": {
        "term" : { "tag" : "tech" }
      },
      "must_not" : {
        "range" : {
          "age" : { "gte" : 10, "lte" : 20 }
        }
      },
      "should" : [
        { "term" : { "tag" : "wow" } },
        { "term" : { "tag" : "elasticsearch" } }
      ],
      "minimum_should_match" : 1,
      "boost" : 1.0
    }
  }
}

使用 minimum_should_match

可以使用 minimum_should_match 参数来指定返回文档 必须(must) 匹配的should子句的数量或百分比。

如果 bool 查询至少包含一个 should 子句,并且没有 mustfilter 子句,则默认值为 1。 否则,默认值为 0

关于其他可用的值, 参考 minimum_should_match 参数

bool.filter 评分

filter 元素下指定的查询对评分没有影响,因为返回的分数都是 0。 分数只受已指定的查询的影响。 例如,以下三个查询都返回 status 字段包含词项 active 的所有文档。

第一个查询为所有文档分配 0 分,因为没有指定计分的查询:

GET _search
{
  "query": {
    "bool": {
      "filter": {
        "term": {
          "status": "active"
        }
      }
    }
  }
}

下面这个 bool 查询有一个 match_all 查询,它给所有文档分配 1.0 分。

GET _search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "term": {
          "status": "active"
        }
      }
    }
  }
}

第三个例子, 下面这个 constant_score 查询的行为与上面的第二个示例完全相同。constant_score 查询将分数 1.0 分配给与过滤器匹配的所有文档。

GET _search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "status": "active"
        }
      }
    }
  }
}

使用命名查询(named queries)查看哪些子句匹配

如果需要知道 bool 查询中的哪个子句与查询返回的文档相匹配,可以使用 命名查询(named queries) 为每个子句指定一个名称。