Elasticsearch 基础教程

Elasticsearch 高级教程

Elasticsearch 插件

Elasticsearch 笔记

Elasticsearch FAQ

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/elasticsearch-query-bool.html

es(elasticsearch) bool 查询详解

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


es bool 查询是把任意多个简单查询组合在一起,使用 mustshouldmust_notfilter 选项来表示简单查询之间的逻辑,每个选项都可以出现 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 的子句得分加起来,然后乘以匹配子句的数量,再除以子句的总数

Elasticsearch 查询语句采用基于 RESTful 风格的接口封装成 JSON 格式的对象,称之为 Query DSL。Elast ...
基于 elasticsearch 构建的业务中最常用的聚合查询就是 terms aggregation,它基于 term 粒度的词或数字值进 ...
elasticsearch 删除索引操作能够用单个命令来进行完成,有不同的操作形式,具体如下: ...
Elasticsearch索引管理主要包括如何进行索引的创建、索引的删除、副本的更新、索引读写权限、索引别名的配置等等内容。首先,创建索引m ...
Elasticsearch 创建索引如同 MySQL 创建数据库,es 提供了 RESTFul API 来创建索引,可以通过 PUT 命令快 ...