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

这篇具有很好参考价值的文章主要介绍了【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中构建复杂查询的能力。如果你有任何问题或需要进一步的帮助,请随时在评论中提出。文章来源地址https://www.toymoban.com/news/detail-752203.html

到了这里,关于【Elasticsearch】 10-DSL语法详解-复合查询bool(must、should、must_not、filter)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ElasticSearch - DSL查询语法

    目录 DSL查询分类 全文检索查询 精确查询 地理查询 复合查询 相关性算分 算分函数查询 BooleanQuery DSL查询分类 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询 常见的查询类型包括: 查询所有:查询出所有的数据,一般测试用;例如:match_all 全文检索(full text)查询

    2023年04月08日
    浏览(38)
  • ElasticSearch 高级查询语法Query DSL实战

    ES中提供了一种强大的检索数据方式,这种检索方式称之为Query DSL(Domain Specified Language 领域专用语言) , Query DSL是利用Rest API传递JSON格式的请求体(RequestBody)数据与ES进行交互,这种方式的丰富查询语法让ES检索变得更强大,更简洁。 官方文档:https://www.elastic.co/guide/en/elasti

    2024年02月07日
    浏览(36)
  • 2.ElasticSearch 高级查询语法Query DSL实战

    ES中提供了一种强大的检索数据方式,这种检索方式称之为Query DSL (Domain Specified Language 领域专用语言 ) , Query DSL是利用Rest API传递JSON格式的请求体(RequestBody)数据与ES进行交互,这种方式的丰富查询语法让ES检索变得更强大,更简洁。 Query DSL | Elasticsearch Guide [7.17] | Elastic 语法

    2024年03月15日
    浏览(39)
  • 【ES专题】ElasticSearch 高级查询语法Query DSL实战

    个人在学习的过程中,感觉比较吃力的地方有如下: 语法结构比较陌生 没有中文文档, 只能看英文 其他博客也比较少介绍语法结构。比如说,为什么查询中会出现 query 有ES入门基础,且想进一步学习ES基本操作的朋友 系列上一篇文章:《【ES专题】ElasticSearch快速入

    2024年02月06日
    浏览(35)
  • ElasticSearch - DSL查询文档语法,以及深度分页问题、解决方案

    目录 一、DSL 查询文档语法 前言 1.1、DSL Query 基本语法 1.2、全文检索查询 1.2.1、match 查询 1.2.2、multi_match 1.3、精确查询 1.3.1、term 查询 1.3.2、range 查询 1.4、地理查询 1.4.1、geo_bounding_box 1.4.2、geo_distance 1.5、复合查询 1.5.1、相关性算分 1.5.2、function_score 1.5.3、boolean query 1.6、搜索

    2024年02月07日
    浏览(39)
  • ElasticSearch_dsl实现多字段查询去重过滤详解(script)

    ElasticSearch单字段去重详见博文:ElasticSearch单字段查询去重详解_IT之一小佬的博客-CSDN博客 ElasticSearch多字段去重详见博文:ElasticSearch多字段查询去重过滤详解_IT之一小佬的博客-CSDN博客 本博文将详细介绍使用elasticsearch_dsl进行多字段进行去重。本文示例数据详见上文单字段博

    2023年04月22日
    浏览(28)
  • 【DSL】ES+DSL 查询语法

    一、前言 工作中遇到ES的查询问题,由于业务方给的条件不清晰,有些查询无法实现,需要用到DSL语法查询实现,很久没用生疏了,借此机会复习下。 二、定义 1.基本介绍 Elasticsearch(简称为ES ),一个开源的分布式搜索和分析引擎,主要用于处理大量数据并提供快速、实时

    2024年02月12日
    浏览(33)
  • ElasticSearch DSL语法

    一、文档批量操作 1.批量获取文档数据 批量获取文档数据是通过_mget的API来实现的 (1)在URL中不指定index和type 请求方式:GET 请求地址:_mget 功能说明 : 可以通过ID批量获取不同index和type的数据 请求参数: docs : 文档数组参数 _index : 指定index _type : 指定type(7.x的版本不推荐使

    2024年03月16日
    浏览(29)
  • RestClient操作文档和DSL查询语法

    注:一般不用上方地理查询,用下面方法! 算法了解 4.1、Function Score Query(修改相关性算分) 4.2、Boolean Query

    2024年02月16日
    浏览(34)
  • ES高级查询语法DSL实战 - 第504篇

    历史文章( 文章 累计500+) 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《国内最全的Spring Boot系列之七》 E

    2024年04月27日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包