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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 公交信息在线查询小程序的设计
  • 【vue3】template标签的一些理解(提了一嘴component标签)
  • 要抓住国际白银现货行情 以下这几点需要注意
  • Java毕业设计 基于SSM和Vue的美容院管理系统小程序
  • 科普文:Lombok使用及工作原理详解
  • 【Python数据结构与算法】递归----上台阶
  • 设计理念中——抽象与接口和用(C#)
  • 【运维自动化】网络统一监控运维管理解决方案(PPT建设方案)
  • SpringCache的使用
  • unplugin-vue-components 插件配置 忽略 部分目录下的组件自动导入
  • Python 实现光波带宽换算(完结)
  • 信号处理——自相关和互相关分析
  • promise一点通,promise.all用法,try catch基本用法图
  • 智能相机背后的图像防抖(IS)技术介绍
  • 【GoLang】Golang 快速入门(第一篇)
  • Fastjson的基本使用方法大全
  • Go 语言编译器的 //go: 详解
  • happypack两次报错的问题
  • iOS 颜色设置看我就够了
  • Mocha测试初探
  • React16时代,该用什么姿势写 React ?
  • React-生命周期杂记
  • scrapy学习之路4(itemloder的使用)
  • SpingCloudBus整合RabbitMQ
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • Zepto.js源码学习之二
  • 阿里研究院入选中国企业智库系统影响力榜
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 聚类分析——Kmeans
  • 坑!为什么View.startAnimation不起作用?
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​ssh免密码登录设置及问题总结
  • ###项目技术发展史
  • #162 (Div. 2)
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #stm32整理(一)flash读写
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (2020)Java后端开发----(面试题和笔试题)
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (十六)视图变换 正交投影 透视投影
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (原)Matlab的svmtrain和svmclassify
  • (转)Android学习笔记 --- android任务栈和启动模式
  • (转)http-server应用
  • (转)Linux下编译安装log4cxx
  • (转)一些感悟
  • **PyTorch月学习计划 - 第一周;第6-7天: 自动梯度(Autograd)**
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .net framework4与其client profile版本的区别
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉