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

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

dify打造数据可视化图表

一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...

自然语言处理——文本分类

文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...

Monorepo架构: Nx Cloud 扩展能力与缓存加速

借助 Nx Cloud 实现项目协同与加速构建 1 ) 缓存工作原理分析 在了解了本地缓存和远程缓存之后,我们来探究缓存是如何工作的。以计算文件的哈希串为例,若后续运行任务时文件哈希串未变,系统会直接使用对应的输出和制品文件。 2 …...

leetcode73-矩阵置零

leetcode 73 思路 记录 0 元素的位置:遍历整个矩阵,找出所有值为 0 的元素,并将它们的坐标记录在数组zeroPosition中置零操作:遍历记录的所有 0 元素位置,将每个位置对应的行和列的所有元素置为 0 具体步骤 初始化…...

【Java多线程从青铜到王者】单例设计模式(八)

wait和sleep的区别 我们的wait也是提供了一个还有超时时间的版本,sleep也是可以指定时间的,也就是说时间一到就会解除阻塞,继续执行 wait和sleep都能被提前唤醒(虽然时间还没有到也可以提前唤醒),wait能被notify提前唤醒&#xf…...