当前位置: 首页 > news >正文

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的主要区别:

  1. 评分计算:
    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。
区别Filtermust
功能过滤出满足特定条件的文档,不计算相关度分数指定查询时必须满足的条件,并计算相关度分数
性能通常具有更好的性能,结果可缓存性能略逊于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只要掌握了基础语法规则,明确了实现过程,都能达到想要实现的结果&#xff0…...

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&#xff0c…...

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飞致云以月度为单位发布《飞致云开源社区月度动态报告》,旨在向广大社区用户同步飞致云旗下系列开源软件的发展情况,以及当月主要的产品新版本发布、社区运营成果等相关信息。 飞致云开源大屏…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

Python如何给视频添加音频和字幕

在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)&#xff…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...

vue3 daterange正则踩坑

<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)

Name&#xff1a;3ddown Serial&#xff1a;FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名&#xff1a;Axure 序列号&#xff1a;8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...

跨平台商品数据接口的标准化与规范化发展路径:淘宝京东拼多多的最新实践

在电商行业蓬勃发展的当下&#xff0c;多平台运营已成为众多商家的必然选择。然而&#xff0c;不同电商平台在商品数据接口方面存在差异&#xff0c;导致商家在跨平台运营时面临诸多挑战&#xff0c;如数据对接困难、运营效率低下、用户体验不一致等。跨平台商品数据接口的标准…...

Redis上篇--知识点总结

Redis上篇–解析 本文大部分知识整理自网上&#xff0c;在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库&#xff0c;Redis 的键值对中的 key 就是字符串对象&#xff0c;而 val…...

OpenGL-什么是软OpenGL/软渲染/软光栅?

‌软OpenGL&#xff08;Software OpenGL&#xff09;‌或者软渲染指完全通过CPU模拟实现的OpenGL渲染方式&#xff08;包括几何处理、光栅化、着色等&#xff09;&#xff0c;不依赖GPU硬件加速。这种模式通常性能较低&#xff0c;但兼容性极强&#xff0c;常用于不支持硬件加速…...