es之must、filter、must_not、should
文章目录
- 概述
- must
- filter
- must_not
- should
- must和filter的区别
概述
在Elasticsearch中,布尔查询(bool query)是构建复杂查询的基本工具。它允许你组合多个查询子句,每个子句可以使用不同的逻辑操作符。常见的逻辑操作符包括 must、filter 和 must_not。下面是它们之间的详细区别和用法:
在Elasticsearch(ES)中,must、filter(通常是通过bool查询中的filter子句实现)、和must_not是构建复杂查询条件时常用的几个关键词,它们各自具有不同的用途和行为特性。理解这些区别对于优化查询性能和构建精确的搜索条件至关重要。
must
用途:must子句用于指定查询中必须满足的条件。只有当文档满足must子句中的所有条件时,该文档才会被包含在搜索结果中。
影响:must子句会影响文档的评分(score)。Elasticsearch会根据查询条件与文档内容的匹配程度计算每个文档的评分,从而决定搜索结果的排序。
示例:在搜索包含特定关键词的文档时,这个关键词的查询条件就会放在must子句中。
filter
用途:虽然filter不是直接作为查询的一部分使用的关键字(实际上,它是bool查询中的一个字段),但它用于指定查询中必须满足的过滤条件,但不会影响文档的评分。
影响:由于filter条件不会计算评分,因此它们可以显著提高查询性能,特别是在处理大量数据时。这对于需要快速返回匹配结果的场景非常有用。
示例:在搜索特定时间范围内的文档时,时间范围会作为filter条件,因为时间范围对文档的评分没有影响,但它是搜索结果的一个重要过滤条件。
must_not
用途:must_not子句用于指定查询中必须不满足的条件。如果文档满足must_not子句中的任何条件,该文档就不会被包含在搜索结果中。
影响:must_not条件同样会影响文档的评分,但在这个上下文中,它的主要目的是排除不满足条件的文档,而不是计算评分。
示例:在搜索不包含特定关键词的文档时,这个关键词的查询条件就会放在must_not子句中。
总结
使用must来指定查询中必须满足的条件,并希望这些条件影响文档的评分。
使用filter(在bool查询中)来指定过滤条件,这些条件必须满足,但不会影响文档的评分,从而提高查询性能。
使用must_not来排除不满足特定条件的文档。
理解这些区别有助于在构建Elasticsearch查询时做出正确的选择,以达到最佳的查询性能和结果准确性。
must
功能:要求查询的条件必须匹配。文档必须满足 must 子句中的所有条件才能被包括在搜索结果中。
用法:类似于逻辑上的 AND 操作。
示例:
GET /my_index/_search
{"query": {"bool": {"must": [{ "match": { "title": "Elasticsearch" } },{ "match": { "status": "active" } }]}}
}
filter
功能:与 must 类似,要求查询的条件必须匹配,但 filter 子句不会影响相关性评分(score)。适用于不需要评分的条件(如过滤器)。
用法:对查询结果进行过滤,不计算相关性得分,提高查询性能。
示例:
GET /my_index/_search
{"query": {"bool": {"must": [{ "match": { "title": "Elasticsearch" } }],"filter": [{ "term": { "status": "active" } }]}}
}
must_not
功能:要求查询的条件不能匹配。文档必须不满足 must_not 子句中的所有条件才能被包括在搜索结果中。
用法:类似于逻辑上的 NOT 操作。
示例:
GET /my_index/_search
{"query": {"bool": {"must": [{ "match": { "title": "Elasticsearch" } }],"must_not": [{ "term": { "status": "inactive" } }]}}
}
should
功能:要求查询的条件可以匹配但不是必须匹配。文档只要满足 should 子句中的任一条件,就会被包括在搜索结果中。如果有多个 should 子句,至少有一个条件满足即可。
用法:类似于逻辑上的 OR 操作。
示例:
GET /my_index/_search
{"query": {"bool": {"must": [{ "match": { "title": "Elasticsearch" } }],"should": [{ "match": { "tags": "search" } },{ "match": { "tags": "database" } }],"minimum_should_match": 1}}
}
综合示例
以下是一个综合示例,展示了如何结合使用 must、filter、must_not 和 should:
GET /my_index/_search
{"query": {"bool": {"must": [{ "match": { "title": "Elasticsearch" } }],"filter": [{ "term": { "status": "active" } }],"must_not": [{ "term": { "category": "archived" } }],"should": [{ "match": { "tags": "search" } },{ "match": { "tags": "database" } }],"minimum_should_match": 1}}
}
详细解释
must: 文档必须匹配 title 为 “Elasticsearch”。
filter: 文档必须有 status 为 “active”。
must_not: 文档不能有 category 为 “archived”。
should: 文档应该匹配 tags 为 “search” 或 “database”,至少满足一个条件(通过 minimum_should_match 参数指定)。
这些子句可以组合在一起,构建复杂的查询逻辑,根据具体需求进行灵活运用。如果你有更多的具体需求或进一步的问题,请随时告知!
must和filter的区别
在Elasticsearch中,must和filter都是bool查询子句的一部分,但它们在使用和目的上有一些明显的区别。以下是关于must和filter的主要区别:
- 评分计算:
must:所有列在must部分的查询条件必须匹配。它类似于逻辑操作符AND,并且会计算每个匹配文档的得分。文档的得分将基于其在must子句中的查询条件的匹配程度来计算。
filter:与must类似,它包含必须匹配的条件,但不同之处在于,filter不会影响评分,只用于过滤数据。这意味着使用filter子句匹配的文档将获得一个中性的得分,这通常是Elasticsearch内部的一个默认值(例如1.0)。由于filter不参与评分计算,它通常用于范围查询、存在/不存在检查等场景,这些场景不需要计算文档的相关性得分。
2.缓存:
filter子句下的查询通常可以被Elasticsearch缓存,这有助于提高查询性能,特别是当相同的过滤条件被频繁使用时。相比之下,must子句下的查询通常不会被缓存,除非它们作为查询的一部分被明确地缓存。
3.使用场景:
must:当您需要计算文档的相关性得分并基于这些得分对结果进行排序时,应该使用must子句。例如,在全文搜索或基于多个条件的复合搜索中,您可能希望根据文档与查询条件的匹配程度对结果进行排序。
filter:当您只需要根据某些条件筛选文档,而不关心它们的相关性得分时,应该使用filter子句。例如,在范围查询、日期筛选或基于特定字段值的筛选中,您可能只关心哪些文档满足这些条件,而不关心它们的得分。
4.性能:
5.由于filter不参与评分计算,并且可以被缓存,因此它通常比must更快。在处理大量数据或需要高性能的查询时,优先考虑使用filter。
区别 | Filter | must |
---|---|---|
功能 | 过滤出满足特定条件的文档,不计算相关度分数 | 指定查询时必须满足的条件,并计算相关度分数 |
性能 | 通常具有更好的性能,结果可缓存 | 性能略逊于filter,需要计算分数 |
使用场景 | 需要根据特定条件筛选文档,但不需要排序 | 需要精确匹配查询条件,并根据相关性排序 |
示例:使用must进行全文搜索和基于条件的筛选:
{ "query": { "bool": { "must": [ { "match": { "name": "智能手机" } }, { "term": { "status": "正常" } } ] } }
}
使用filter进行范围筛选和日期筛选:
{ "query": { "bool": { "must": [ { "match": { "name": "智能手机" } } ], "filter": [ { "range": { "price": { "gte": 200, "lte": 400 } } }, { "range": { "order_date": { "gte": "2020-01-01", "lte": "2020-12-31" } } } ] } }
}
总结来说,must和filter都是Elasticsearch中用于构建复杂查询的重要工具。选择使用哪个子句取决于您的具体需求,包括是否需要计算文档的相关性得分、是否需要缓存查询以及查询的性能要求等。
相关文章:
es之must、filter、must_not、should
文章目录 概述mustfiltermust_notshouldmust和filter的区别 概述 在Elasticsearch中,布尔查询(bool query)是构建复杂查询的基本工具。它允许你组合多个查询子句,每个子句可以使用不同的逻辑操作符。常见的逻辑操作符包括 must、…...

RocketMQ消息发送基本示例(推送消费者)
消息生产者通过三种方式发送消息 1.同步发送:等待消息返回后再继续进行下面的操作 同步发送保证了消息的可靠性,适用于关键业务场景。 2.异步发送:不等待消息返回直接进入后续流程.broker将结果返回后调用callback函数,并使用 CountDownLatch计数 3.单向发送:只…...
23 MySQL基本函数、分组查询、多列排序(3)
上一篇「22 B端产品经理与MySQL基本查询、排序(2)」了解了基本的常识和基本查询以及单列排序。下面介绍常见的基本函数、分组查询以及多列排序: 基本函数 user表 (注:以下SQL语句示例全部基于下面「user表」) uidunamedepiduag…...

PHP与SEO,应用curl库获取百度下拉关键词案例!
编程语言从来都是工具,编程逻辑思维才是最重要的,在限定的规则内,实现自己的想法,正如人生一样! 不管是python还是php只要掌握了基础语法规则,明确了实现过程,都能达到想要实现的结果࿰…...

MySQL:子查询
MySQL 子查询 MySQL中的子查询是一个强大的功能,子查询是指在一个查询语句中嵌套另一个查询语句的情况。嵌套查询中的内部查询语句可以使用外部查询语句的结果来进行过滤、联接或作为子查询的值,它允许我们在一个查询内部嵌套另一个查询。通过子查询可以…...

C++—— IO流
一、C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf()和printf()。 scanf():从标准输入设备(键盘)中读取数据,并将值存放在变量中。 printf():将指定的文字/字符串输出到标准输出设备(…...
vue+node后台处理大文件切片上传--前端部分
本文主要介绍,在vue3vite项目下,如何进行有效的大文件上传,本文章主要讲大文件切片上传方式,并提供简单的demo代码供参考 首先,请确保已经创建好项目,这一步跳过。 1、为了选择合适的文件,我们…...

【通俗理解】艺术与数学交融
【通俗理解】艺术与数学交融 艺术与数学的奇妙交融 你可以把艺术比作一个“梦幻花园”,它充满了无限的可能性和美感。而数学则是一把“精密钥匙”,它能够解开花园中的秘密,揭示美的内在结构。 艺术与数学交融的核心作用 组件/步骤描述艺术表…...

深入探讨 Docker 容器文件系统
引言 随着云计算和微服务架构的兴起,Docker 容器技术迅速成为开发和运维人员的首选工具。Docker 容器不仅提供了一种轻量级的虚拟化方式,还简化了应用程序的部署和管理。在众多的技术细节中,Docker 容器文件系统是一个至关重要的组成部分。本…...

《LeetCode热题100》---<4.子串篇三道>
本篇博客讲解LeetCode热题100道子串篇中的三道题 第一道:和为 K 的子数组 第二道:滑动窗口最大值 第三道:最小覆盖子串 第一道:和为 K 的子数组(中等) 法一:暴力枚举 class Solution {public in…...

全国区块链职业技能大赛样题第9套前端源码
后端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746050 前端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746216 智能合约+数据库表设计:https://blog.csdn.net/Qhx20040819/article/details/140746646 登录 用户管理...
如何提高编程面试成功率:LeetCode Top 100 问题及解答解析(详细面试宝典)
以下是 LeetCode Top 100 面试必备题目及其解决方案示例。这些题目涵盖了数据结构、算法、动态规划、回溯等多种重要的面试话题。希望各位同学有所收货,早日脱离底层到达彼岸! 1. Two Sum 题目: 给定一个整数数组 nums 和一个目标值 target,…...

K-近邻和神经网络
K-近邻(K-NN, K-Nearest Neighbors) 原理 K-近邻(K-NN)是一种非参数分类和回归算法。K-NN 的主要思想是根据距离度量(如欧氏距离)找到训练数据集中与待预测样本最近的 K 个样本,并根据这 K 个…...

用EasyV全景图低成本重现真实场景,360°感受数字孪生
全景图,即借助绘画、相片、视频、三维模型等形式,通过广角的表现手段,尽可能多表现出周围的环境。避免了一般平面效果图视角单一,不能带来全方位视角的缺陷,能够全方位的展示360度球型范围内的所有景致,最大…...

【Golang 面试 - 进阶题】每日 3 题(九)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…...

孟德尔随机化、R语言,报错,如何解决?
🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…...

一文剖析高可用向量数据库的本质
面对因电力故障、网络问题或人为操作失误等导致的服务中断,数据库系统高可用能够保证系统在这些情况下仍然不间断地提供服务。如果数据库系统不具备高可用性,那么系统就需要承担停机和数据丢失等重大风险,而这些风险极有可能造成用户流失&…...
JavaScript青少年简明教程:异常处理
JavaScript青少年简明教程:异常处理 在 JavaScript 中,异常指的是程序执行过程中出现的错误或异常情况。这些错误可能导致程序无法正常执行,甚至崩溃。ECMA-262规范了多种JavaScript错误类型,这些类型都继承自Error基类。主要的错…...

科普文:Lombok使用及工作原理详解
1. 概叙 Lombok是什么? Project Lombok 是一个 JAVA 库,它可以自动插入编辑器和构建工具,为您的 JAVA 锦上添花。再也不要写另一个 getter/setter 或 equals 等方法,只要有一个注注解,你的类就有一个功能齐全的生成器…...

飞致云开源社区月度动态报告(2024年7月)
自2023年6月起,中国领先的开源软件公司FIT2CLOUD飞致云以月度为单位发布《飞致云开源社区月度动态报告》,旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况,以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源大屏…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
mongodb源码分析session执行handleRequest命令find过程
mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程,并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令,把数据流转换成Message,状态转变流程是:State::Created 》 St…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...