es之must、filter、must_not、should

devtools/2024/9/23 1:13:28/

文章目录

    • 概述
    • 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中用于构建复杂查询的重要工具。选择使用哪个子句取决于您的具体需求,包括是否需要计算文档的相关性得分、是否需要缓存查询以及查询的性能要求等。


http://www.ppmy.cn/devtools/88077.html

相关文章

Python学习笔记49:游戏篇之外星人入侵(十)

前言 之前的文章,已经把基础的游戏功能完成了,就像我们之前项目先写好了基础代码一样,游戏基础的逻辑代码已经编写完毕,后面我们会一步步的填充这个游戏的功能。 我的文章内容和功能实现顺序和原文教学并不是一模一样&#xff0…

生成式人工智能(AIGC):开发者的得力助手还是职业威胁?

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引言 在当今软件开发领域,生成式人工智能(AIGC)技术正在以前所未有的方式改变着开发者的工作…

Hadoop-YARN

简介 YARN是Hadoop的资源管理和作业调度系统,它将集群资源管理和作业调度/监控功能从Hadoop MapReduce的实现中分离出来,使得Hadoop可以支持除了MapReduce之外的其他数据处理模型。用户可以将各种服务框架部署在 YARN 上,由 YARN 进行统一地…

网络安全之不同阶段攻防手段(四)

前面已经说过信息收集、扫描探测以及初始访问阶段的攻防手段,下面将说一下在攻击者获取到访问权限的情况下会接着如何进一步在网络中建立控制点、提权、横移以及完成攻击后的遗迹隐藏。 4. 建立立足点阶段 **攻击手段:**攻击者通过恶意软件、远程访问工…

【人工智能】GPT-5的即将到来:从高中生进化到,,,博士生?

GPT-5的即将到来:从高中生进化到,博士生? 随着近月GPT-4o的出世,OpenAI也在进行一系列的采访和介绍接下来的展望和目标。 在6月22日的采访中,美国达特茅斯工程学院公布了OpenAI首席技术官米拉穆拉蒂的访谈内容。穆拉蒂确认&#…

包拯断案 | 数据库从库复制延迟引发高可用风险 怎么破@还故障一个真相

提问:作为DBA运维的你是否遇到过这些烦恼 1、数据库从库复制出现了延迟,是什么原因导致的? 2、延迟引发了高可用风险,应该如何处理? 心中有章,遇事不慌 作为DBA的你,遇到问题无从下手&#xf…

大模型评测与算法测试的区别和共同点-【2024实践总结】

算法测试和大语言模型评测之间存在着区别和共同点。以下是详细的比较: 共同点 目的:无论是算法测试还是大语言模型评测,其根本目的都是确保和评估技术解决方案的性能、可靠性和有效性。这是为了验证这些技术是否能够满足预期的需求和标准[3…

前端框架 element-plus 发布 2.7.8

更新日志 功能 组件 [级联选择器 (cascader)] 添加持久化属性以提升性能 (#17526 by 0song)[日期选择器 (date-picker)] 类型添加月份参数 (#17342 by Panzer-Jack)[级联选择器 (cascader)] 添加标签效果属性 (#17443 by ntnyq)[加载 (loading)] 补充加载属性 (#17174 by zhixi…