谷粒商城实战笔记-115-全文检索-ElasticSearch-进阶-bool复合查询

文章目录

1,must

dart 复制代码
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "gender": "M"
          }
        },
        {
          "match": {
            "address": "mill"
          }
        }
      ]
    }
  }
}
  • bool: 这是一个布尔查询,用于组合多个查询条件。
  • must: 表示查询中必须满足的条件。如果文档不满足must中的任何条件,它将不会被包含在搜索结果中。

具体到这段代码,它定义了一个查询,其条件如下:

  • 必须匹配性别为男性(gender:"M"
  • 必须匹配邮件中包含mill
  • 以上两个条件都匹配的文档才能命中
  • 结果如下,满足3个文档

2,must not

dart 复制代码
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "gender": "M"
          }
        },
        {
          "match": {
            "address": "mill"
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "age": "28"
          }
        }
      ]
    }
  }
}
  • bool: 布尔查询组合多个查询条件。
  • must: 表示查询中必须满足的条件。如果文档不满足must中的任何条件,它将不会被包含在搜索结果中。
  • must_not: 表示查询中必须不满足的条件。如果文档满足must_not中的任何条件,它将不会被包含在搜索结果中。

具体到这段代码,定义了一个bool查询,其条件如下:

  • 必须匹配性别为男性(gender:"M"
  • 必须匹配邮件包含mill
  • 必须不匹配年龄为28岁的文档(age:"28"
  • 相对于前一个查询,多了must not条件规定的年龄不能是28岁,条件更多更严苛,命中的文档更少

3,should

在布尔查询中,should子句用于指定一组可选条件。这些条件不是必须满足的,但如果文档满足这些条件,它们可以提高文档的相关性得分(即_score)。should子句通常与minimum_should_match参数一起使用,这个参数指定了至少需要多少个should条件被满足,文档才会被认为是匹配的。

这里是should子句的一些关键点:

  1. 可选性should中的条件是可选的,不强制要求文档必须满足。
  2. 提升得分 :如果文档满足should中的条件,它的得分可能会提高,这取决于查询的构建方式和Elasticsearch的算法。
  3. minimum_should_match :这个参数定义了至少需要多少个should条件被满足。例如,如果你有3个should条件,你可以设置minimum_should_match为2,这意味着文档至少需要满足2个条件才能被认为是匹配的。
  4. mustmust_not结合使用should可以与must(必须满足的条件)和must_not(必须不满足的条件)一起使用,以构建复杂的查询。
dart 复制代码
GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "gender": "M"
          }
        },
        {
          "match": {
            "address": "mill"
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "age": "18"
          }
        }
      ],
      "should": [
        {
          "match": {
            "lastname": "Wallace"
          }
        }
      ],
      "minimum_should_match": 0
    }
  }
}
  • bool:布尔查询,它允许组合多个查询条件。

    • must:包含必须满足的查询条件。文档必须满足must中的所有条件才会被包含在搜索结果中。在这个例子中,must有两个条件:

      • 性别(gender)必须是"M"。
      • 地址(address)必须包含"mill"。
    • must_not:包含必须不满足的查询条件。文档如果满足must_not中的任何条件,将不会被包含在搜索结果中。在这个例子中,must_not有一个条件:

      • 年龄(age)不能是"18"。
    • should:包含可选的查询条件。如果文档满足should中的条件,它可以提高文档的相关性得分,但不是必需的。在这个例子中,should有一个条件:

      • 姓氏(lastname)必须是"Wallace"。
    • minimum_should_match:指定至少需要多少个should条件被满足。在这个例子中,minimum_should_match设置为0,这意味着即使没有should条件被满足,文档也可以出现在搜索结果中。这个设置通常用于不强制要求should条件,但希望它们能够影响文档得分的情况。

总结来说,这个查询将返回bank索引中满足以下条件的文档:

  • 性别为男性("M")。
  • 地址包含"mill"。
  • 年龄不是18岁。
  • (可选)姓氏为Wallace的文档可能会获得更高的相关性得分,但这不是必需的。

需要注意的,shouldminimum_should_match配合使用,如果minimum_should_match等于1,必须满足should中至少1个条件,相当于must,当比must更灵活,因为should中如果有多个条件的话,只需要满足任意一个即可。

如果,把上面的查询中的minimum_should_match值改为1,则查询出来的结果更少。

相关推荐
时间之城24 分钟前
笔记:记一次使用EasyExcel重写convertToExcelData方法无法读取@ExcelDictFormat注解的问题(已解决)
java·spring boot·笔记·spring·excel
灏瀚星空33 分钟前
用Obsidian四个插件打造小说故事关联管理系统:从模板到图谱的全流程实践
经验分享·笔记·开源
一只可爱的小猴子1 小时前
2022李宏毅老师机器学习课程笔记
人工智能·笔记·机器学习
孞㐑¥1 小时前
C++11介绍
开发语言·c++·经验分享·笔记
使一颗心免于哀伤1 小时前
《重构》笔记摘录 - 9.处理继承关系
笔记
再睡一夏就好2 小时前
Linux常见工具如yum、vim、gcc、gdb的基本使用,以及编译过程和动静态链接的区别
linux·服务器·c语言·c++·笔记
俺的图图呢?2 小时前
Django笔记——CSRF
笔记·django·csrf
我的golang之路果然有问题2 小时前
快速了解redis,个人笔记
数据库·经验分享·redis·笔记·学习·缓存·内存
无心水2 小时前
【Java面试笔记:基础】8.对比Vector、ArrayList、LinkedList有何区别?
java·笔记·面试·vector·arraylist·linkedlist
卡皮巴拉爱吃小蛋糕3 小时前
MySQL的MVCC【学习笔记】
数据库·笔记·mysql