Elasticsearch 基础教程

Elasticsearch 高级教程

Elasticsearch 插件

Elasticsearch 笔记

Elasticsearch bool query(组合查询)详解

Elasticsearch(es) 查询语句语法详解 Elasticsearch(es) 查询语句语法详解


bool query(组合查询)是把任意多个简单查询组合在一起,使用 mustshouldmust_notfilter 选项来表示简单查询之间的逻辑,每个选项都可以出现 0 次到多次。它是为了满足现实中比较复杂的查询需求,如需要在多个字段上查询多种多样的文本,并且根据一系列的标准来过滤。

子选项

bool query 主要通过下列 4 个选项来构建用户想要的布尔查询,每个选项的含义如下:

  • must 文档必须匹配 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 的子句得分加起来,然后乘以匹配子句的数量,再除以子句的总数