【Elasticsearch】bool查询

news2025/2/14 1:33:06

Elasticsearch 的`bool`查询是构建复杂查询条件的核心工具之一。它允许通过布尔逻辑组合多个查询子句,以实现精确的搜索需求。`bool`查询支持四种主要的子句类型:`must`、`should`、`filter`和`must_not`。每种子句类型都有其特定的作用和行为。


1.`bool`查询的基本结构
`bool`查询的基本结构如下:

```json
{
  "query": {
    "bool": {
      "must": [/* 必须匹配的查询 */],
      "should": [/* 应该匹配的查询 */],
      "filter": [/* 过滤条件 */],
      "must_not": [/* 必须不匹配的查询 */]
    }
  }
}
```

2.子句类型详解


2.1`must`子句

• 作用:`must`子句中的查询必须匹配。它相当于逻辑“与”(AND)操作。

• 评分:`must`子句中的查询会对文档的评分(`_score`)有贡献。

• 示例:

```json
  {
    "query": {
      "bool": {
        "must": [
          { "match": { "title": "Elasticsearch" } },
          { "match": { "content": "search engine" } }
        ]
      }
    }
  }
  ```


• 解释:返回`title`包含"Elasticsearch"并且`content`包含"search engine"的文档。


2.2`should`子句

• 作用:`should`子句中的查询应该匹配,但不是必须的。它相当于逻辑“或”(OR)操作。

• 评分:`should`子句中的查询会对文档的评分有贡献,但只有当`minimum_should_match`参数满足时,文档才会被返回。

• `minimum_should_match`参数:

• 用于指定必须匹配的`should`子句的最小数量。

• 如果没有指定,默认值为`0`,除非没有`must`或`filter`子句,此时默认值为`1`。

• 示例:

```json
  {
    "query": {
      "bool": {
        "should": [
          { "match": { "tags": "Elasticsearch" } },
          { "match": { "tags": "Kibana" } }
        ],
        "minimum_should_match": 1
      }
    }
  }
  ```


• 解释:返回`tags`包含"Elasticsearch"或者"Kibana"的文档。


2.3`filter`子句

• 作用:`filter`子句中的查询必须匹配,但不会对文档的评分有贡献。它主要用于过滤数据,而不影响评分。

• 评分:`filter`子句中的查询不会对文档的评分产生影响,所有匹配的文档的评分默认为`0`。

• 缓存:`filter`子句通常会被缓存,从而提高查询效率。

• 示例:

```json
  {
    "query": {
      "bool": {
        "filter": [
          { "term": { "status": "active" } }
        ]
      }
    }
  }
  ```


• 解释:返回`status`字段值为"active"的文档,但不对评分产生影响。


2.4`must_not`子句

• 作用:`must_not`子句中的查询必须不匹配。它相当于逻辑“非”(NOT)操作。

• 评分:`must_not`子句中的查询不会对文档的评分有贡献,所有匹配的文档的评分默认为`0`。

• 示例:

```json
  {
    "query": {
      "bool": {
        "must_not": [
          { "range": { "age": { "gte": 10, "lte": 20 } } }
        ]
      }
    }
  }
  ```


• 解释:返回`age`字段值不在 10 到 20 之间的文档。


3.综合示例
以下是一个综合使用`must`、`should`、`filter`和`must_not`的查询示例:

```json
{
  "query": {
    "bool": {
      "must": [
        { "match": { "title": "Elasticsearch" } }
      ],
      "should": [
        { "match": { "tags": "Kibana" } },
        { "match": { "tags": "Logstash" } }
      ],
      "minimum_should_match": 1,
      "filter": [
        { "term": { "status": "active" } }
      ],
      "must_not": [
        { "range": { "age": { "gte": 10, "lte": 20 } } }
      ]
    }
  }
}
```

• 解释:

• 必须匹配`title`包含"Elasticsearch"。

• 至少匹配一个`tags`包含"Kibana"或"Logstash"。

• 必须匹配`status`为"active",但不考虑评分。

• 必须不匹配`age`在 10 到 20 之间。


4.评分机制

• 评分计算:

• `must`和`should`子句中的查询会对文档的评分有贡献。

• `filter`和`must_not`子句中的查询不会对评分产生影响。

• Elasticsearch 会根据匹配的`must`和`should`子句计算文档的最终评分。


• 评分优化:

• 如果你不需要评分,可以使用`constant_score`查询包装`filter`子句,以进一步优化性能。

```json
  {
    "query": {
      "constant_score": {
        "filter": {
          "term": { "status": "active" }
        }
      }
    }
  }
  ```

5.性能优化

• 缓存:

• `filter`和`must_not`子句通常会被缓存,从而提高查询效率。

• 如果查询中包含大量`filter`子句,可以考虑使用`filter`缓存来优化性能。


• 减少子句数量:

• 尽量减少`must`和`should`子句的数量,以提高查询性能。

• 如果不需要评分,尽量使用`filter`子句。


6.总结
`bool`查询是 Elasticsearch 中非常强大的工具,通过组合`must`、`should`、`filter`和`must_not`子句,可以实现复杂的查询逻辑。合理使用这些子句可以提高查询的灵活性和性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2297647.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 mkcert 本地部署启动了 TLS/SSL 加密通讯的 MongoDB 副本集和分片集群

MongoDB 是支持客户端与 MongoDB 服务器之间启用 TLS/SSL 进行加密通讯的, 对于 MongoDB 副本集和分片集群内部的通讯, 也可以开启 TLS/SSL 认证. 本文会使用 mkcert 创建 TLS/SSL 证书, 基于创建的证书, 介绍 MongoDB 副本集、分片集群中启动 TLS/SSL 通讯的方法. 我们将会在…

P3372 【模板】线段树 1【题解2】

本题题解分两篇 此篇为第贰篇,用树状数组做 第壹篇:P3372 【模板】线段树 1【题解1】 本文讲解树状数组解决区间修改区间查询 其它树状数组相关文章: 树状数组讲解单点修改/查询树状数组解决区间修改单点查询 P3372 【模板】线段树 1 题…

使用 EDOT 监测由 OpenAI 提供支持的 Python、Node.js 和 Java 应用程序

作者:来自 Elastic Adrian Cole Elastic 很自豪地在我们的 Python、Node.js 和 Java EDOT SDK 中引入了 OpenAI 支持。它们为使用 OpenAI 兼容服务的应用程序添加日志、指标和跟踪,而无需任何代码更改。 介绍 去年,我们宣布了 OpenTelemetry…

CNN-BiGRU卷积神经网络双向门控循环单元多变量多步预测,光伏功率预测

CNN-BiGRU卷积神经网络双向门控循环单元多变量多步预测,光伏功率预测 代码下载:CNN-BiGRU卷积神经网络双向门控循环单元多变量多步预测,光伏功率预测 一、引言 1.1、研究背景及意义 随着全球能源危机和环境问题的日益严重,可再…

mysql8.0使用MGR实现高可用与利用MySQL Router构建读写分离MGR集群

MGR是MySQL Group Replication的缩写,即MySQL组复制。 在以往,我们一般是利用MySQL的主从复制或半同步复制来提供高可用解决方案,但这存在以下几个比较严重的问题: 主从复制间容易发生复制延迟,尤其是在5.6以前的版本…

保研考研机试攻略:python笔记(4)

🐨🐨🐨15各类查找 🐼🐼二分法 在我们写程序之前,我们要定义好边界,主要是考虑区间边界的闭开问题。 🐶1、左闭右闭 # 左闭右闭 def search(li, target): h = len(li) - 1l = 0#因为都是闭区间,h和l都可以取到并且相等while h >= l:mid = l + (h - l) // 2…

关于conda换镜像源,pip换源

目录 1. 查看当前下载源2. 添加镜像源2.1清华大学开源软件镜像站2.2上海交通大学开源镜像站2.3中国科学技术大学 3.删除镜像源4.删除所有镜像源,恢复默认5.什么是conda-forge6.pip换源 1. 查看当前下载源 conda config --show channels 如果发现多个 可以只保留1个…

分布式服务框架 如何设计一个更合理的协议

1、概述 前面我们聊了如何设计一款分布式服务框架的问题,并且编码实现了一个简单的分布式服务框架 cheese, 目前 cheese 基本具备分布式服务框架的基本功能。后面我们又引入了缓存机制,以及使用Socket替代了最开始的 RestTemplate。并且还学习了网络相关…

前端快速生成接口方法

大家好,我是苏麟,今天聊一下OpenApi。 官网 : umijs/openapi - npm 安装命令 npm i --save-dev umijs/openapi 在根目录(项目目录下)创建文件 openapi.config.js import { generateService } from umijs/openapi// 自…

mysql 学习12 存储引擎,mysql体系结构

mysql 体系结构 存储引擎简介 存储引擎 就是 存储数据,建立索引,更新/查询 数据等技术的实现方式。 存储引擎 是基于表的,而不是基于库的,所以存储引擎也可以称为 表类型 mysql默认的使用InnoDB 做为存储引擎 查看一下我们之前…

稀土抑烟剂——为汽车火灾安全增添防线

一、稀土抑烟剂的基本概念 稀土抑烟剂是一类基于稀土元素(如稀土氧化物和稀土金属化合物)开发的高效阻燃材料。它可以显著提高汽车内饰材料的阻燃性能,减少火灾发生时有毒气体和烟雾的产生。稀土抑烟剂不仅能提升火灾时的安全性,…

Unity进阶教程AOI算法原理详解

最新课程《全栈双客户端(Unity/Cocos) TurnKey方案》更新了AOI专题,今天分享一下AOI算法的实现原理。 AOI的功能和作用 在MMORPG网路游戏当中,单服同时在线一般都会有几千人。当有个玩家执行一个操作,理想情况下要把玩家的操作广播同步给单…

【C】链表算法题7 -- 环形链表||

leetcode链接https://leetcode.cn/problems/linked-list-cycle-ii/description/ 问题描述 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到…

STM32系统架构介绍

STM32系统架构 1. CM3/4系统架构2. CM3/4系统架构-----存储器组织结构2.1 寄存器地址映射(特殊的存储器)2.2 寄存器地址计算2.3 寄存器的封装 3. CM3/4系统架构-----时钟系统 STM32 和 ARM 以及 ARM7是什么关系? ARM 是一个做芯片标准的公司&#xff0c…

window patch按块分割矩阵

文章目录 1. excel 示意2. pytorch代码3. window mhsa 1. excel 示意 将一个三维矩阵按照window的大小进行拆分成多块2x2窗口矩阵,具体如下图所示 2. pytorch代码 pytorch源码 import torch import torch.nn as nn import torch.nn.functional as Ftorch.set_p…

机器学习(李宏毅)——BERT

一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记,感谢台湾大学李宏毅教授的课程,respect!!! 读这篇文章必须先了解self-attention、Transformer,可参阅我其他文章。 二、大纲 BERT简介self-…

深度学习-111-大语言模型LLM之基于langchain的结构化输出功能实现文本分类

文章目录 1 langchain的结构化输出1.1 推荐的使用流程1.2 模式定义1.3 返回结构化输出1.3.1 工具调用(方式一)1.3.2 JSON模式(方式二)1.3.3 结构化输出法(方式三)2 文本分类2.1 定义分类模式2.2 配置分类提示模板2.3 初始化分类模型2.4 分类示例3 参考附录1 langchain的结构化输…

常见的排序算法:插入排序、选择排序、冒泡排序、快速排序

1、插入排序 步骤: 1.从第一个元素开始,该元素可以认为已经被排序 2.取下一个元素tem,从已排序的元素序列从后往前扫描 3.如果该元素大于tem,则将该元素移到下一位 4.重复步骤3,直到找到已排序元素中小于等于tem的元素…

C++17 中的 std::gcd:探索最大公约数的现代 C++ 实现

文章目录 一、std::gcd 的基本用法(一)包含头文件(二)函数签名(三)使用示例 二、std::gcd 的实现原理三、std::gcd 的优势(一)简洁易用(二)类型安全&#xff…

OpenWRT中常说的LuCI是什么——LuCI介绍(一)

我相信每个玩openwrt的小伙伴都或多或少看到过luci这个东西,但luci到底是什么东西,可能还不够清楚,今天就趁机来介绍下,openwrt中的luci,到底是个什么东西。 什么是LuCI? 首先,LuCI是OpenWRT中…