【Elasticsearch】 10-DSL语法详解-复合查询bool(must、should、must_not、filter)

Elasticsearch中的bool查询详解

Elasticsearch是一个强大的搜索引擎,它提供了丰富的查询功能,以帮助你从大规模数据集中检索相关的文档。在Elasticsearch中,bool查询是一个非常重要和强大的工具,它允许组合多个查询子句,以构建复杂的查询逻辑。在本篇文章中,我们将深入探讨bool查询,包括其概述、参数、各个子句的详解以及多子句嵌套的示例。

1. bool语法概述

bool查询是Elasticsearch中的布尔查询,它允许组合多个查询条件以过滤和排序文档。bool查询有四个主要子句:

  • must:所有的查询子句都必须匹配,类似于"AND"操作。
  • should:至少一个查询子句必须匹配,类似于"OR"操作。
  • must_not:查询子句不应该匹配,类似于"NOT"操作。
  • filter:与must相似,但不会影响查询的相关性得分。

bool查询具有以下特点

  • 内部可以包含多个全文检索和精确查询语法
  • 子查询可以任意顺序出现
  • 可以嵌套多个查询,包括bool查询
  • 如果bool查询中没有must条件,should中必须至少满足一条才会返回结果。

2. bool参数说明及示例

在使用bool查询时,有一些重要的参数可以用来进一步控制查询的行为,包括:

  • minimum_should_match:指定在should查询子句中至少要匹配多少条件才算查询成功。
  • disable_coord:控制是否计算每个条件的坐标因子以调整查询的相关性得分。
  • adjust_pure_negative:控制是否调整纯负面条件的得分。
  • boost:为整个bool查询指定一个权重,以影响其在整个查询中的相关性得分。

2.1. minimum_should_match参数

minimum_should_match参数用于指定在should查询子句中至少要匹配多少条件才算查询成功。这个参数非常有用,因为它可以帮助我们平衡查询的精确性和宽容度。

{
  "query": {
    "bool": {
      "should": [
        { "match": { "title": "Elasticsearch" } },
        { "match": { "content": "Kibana" } }
      ],
      "minimum_should_match": 1
    }
  }
}

在上面的查询中,我们要求至少要匹配一个should条件才算查询成功。

补充说明

参数有以下形式:N表示需要满足的条件数量,S表示条件总数 (1)正整数 N = X,比如给定值为3,那么 N=3。
(2)负整数 N = S |X|,比如给定值为-2,那么 N= S - 2。
(3)正百分比 N = min 取整(S * X),比如 S=5,X = 25% ,那么 N= 1
(4)负百分比 N =S - min 取整(|S * X|),比如 S=5,X = -25% ,那么 N= 5 - 1 = 4。
(5)组合,比如 3<90% 当 S <= 3,则全部都是必需的;当 S > 3,则仅需要90%,按上面的正百分比计算。
(6)多种组合,比如:2<-25% 9<3 多个条件规范可以用空格分隔。每个条件规范仅对大于其前一个的数字有效。
在此示例中:如果有1或2个子句,则都需要;如果有3-9个子句,则需要-25%(按负百分数计算);如果有9个以上的子句,则需要3个。
(7)注意:
当minimum_should_match的值大于子句数量数,DSL将检索不到值;
当minimum_should_match为0时,should子句失效。

2.2. disable_coord参数

disable_coord参数是一个布尔值,用于控制是否计算每个条件的坐标因子以调整查询的相关性得分。将其设置为true可以禁用坐标因子的计算。

{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "Elasticsearch" } }
      ],
      "disable_coord": true
    }
  }
}

2.3. adjust_pure_negative参数

adjust_pure_negative参数也是一个布尔值,用于控制是否调整纯负面条件的得分。默认情况下,Elasticsearch会为纯负面条件的查询调整得分,以避免它们对整体相关性得分的影响。将其设置为false可以禁用此行为。

{
  "query": {
    "bool": {
      "must_not": [
        { "match": { "status": "deprecated" } }
      ],
      "adjust_pure_negative": false
    }
  }
}

2.4. boost参数

boost参数允许你为整个bool查询指定一个权重,以影响其在整个查询中的相关性得分。

{
  "query": {
    "bool": {
      "should": [
        { "match": { "title": "Elasticsearch" } }
      ],
      "boost": 2.0
    }
  }
}

在上面的示例中,should查询子句的权重被设置为2.0,从而增加了它在整个查询中的重要性。

3. must、should、must_not和filter详解及示例

3.1.must

must查询子句用于要求所有的查询条件都必须匹配。

{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "Elasticsearch" } },
        { "range": { "price": { "gte": 50 } } }
      ]
    }
  }
}

在上面的查询中,我们要求文档的title必须包含"Elasticsearch",而且price必须大于或等于50。

3.2.should

should查询子句用于指定多个条件中至少一个必须匹配。

{
  "query": {
    "bool": {
      "should": [
        { "match": { "title": "Elasticsearch" } },
        { "match": { "content": "Kibana" } }
      ]
    }
  }
}

在上面的查询中,文档可以包含"Elasticsearch"或者"Kibana",或者同时包含两者。

should不同情况使用的注意事项

  • 如果bool查询在must里,并且bool查询中具有must或
    filter子句,那么bool中的should查询即使没有匹配到,文档也将与查询匹配。在这种情况下,should的子句仅用于影响得分
  • 如果bool查询在filter里,则文档至少满足should的查询一个条件
  • 如果bool查询既没有在must也没在filter,则文档至少满足should的查询一个条件

3.3.must_not

must_not查询子句用于排除匹配某些条件的文档。

{
  "query": {
    "bool": {
      "must_not": [
        { "match": { "category": "Deprecated" } }
      ]
    }
  }
}

在上面的查询中,我们排除了所有category字段包含"Deprecated"的文档。

3.4.filter

filter查询子句用于过滤文档,但不会影响查询的相关性得分。

{
  "query": {
    "bool": {
      "filter": [
        { "term": { "status": "published" } },
        { "range": { "date": { "gte": "2023-01-01" } } }
      ]
    }
  }
}

在上面的查询中,我们过滤了status为"published"且date大于或等于"2023-01-01"的文档,但不会改变它们的相关性得分。

4. 多子句嵌套bool查询示例

有时可能需要更复杂的查询,例如组合多个bool查询。以下示例展示了不同语法的多子句嵌套bool查询:

{
  "query": {
    "bool": {
      "must": [
        {
          "bool": {
            "should": [
              { "match": { "title": "Elasticsearch" } },
              { "match": { "content": "Kibana" } }
            ]
          }
        }
      ],
      "filter": [
        { "range": { "date": { "gte": "2023-01-01" } } }
      ],
      "must_not": [
        { "match": { "status": "deprecated" } }
      ]
    }
  }
}

5. 结论

本次介绍了Elasticsearch中的bool查询,包括其基本概念、重要参数以及各个查询子句的详解和示例。希望本文对你理解和使用bool查询有所帮助,同时也能够提高你在Elasticsearch中构建复杂查询的能力。如果你有任何问题或需要进一步的帮助,请随时在评论中提出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值