Elasticsearch filter context 的实践案例

news/2024/12/25 0:13:59/文章来源:https://www.cnblogs.com/infinilabs/p/18628946

知识背景

在 ES 查询优化的建议里,很多时候为了避免算分逻辑和利用缓存逻辑,Elastic 会建议大家使用 filter 条件。

filter 的使用条件和原理具体可以参照之前写的博文《Elasticsearch filter context 的使用原理》

这里我们来研究 2 个实用案例,具体的感受一下 filter context 的使用效果。

普通案例

第一个案例,我们选择一个 range date 的条件进行测试环境测试,将其中 must 条件改成 filter 条件,测试 5 次以上,观测其缓存数据。

# 清空缓存
POST indexname/_cache/clear?query=true
# 查询 5-10 次
GET indexname/_search
{"query": {"bool": {"must": [{"range": {"date": {"gte": "2024-01-01","lte": "2024-03-01"}}}]}}
}
# 查询缓存状态
GET indexname/_stats?human=true&filter_path=*.*.query_cache
​

可以看到 query_cache 的 size/count 始终为 0,也就是并没有利用到缓存。

查询的耗时也维持在 900-1100ms 左右。

再测试 filter 条件

POST indexname/_cache/clear?query=true
# 查询 5-10 次
GET indexname/_search
{"query": {"bool": {"filter": [{"range": {"date": {"gte": "2024-01-01","lte": "2024-03-01"}}}]}}
}
​
GET indexname/_stats?human=true&filter_path=*.*.query_cache
​

在重复的查询过程中,查询速度有明显的加快。

多次查询之后

查看 query_cache size/count 有明显的使用。

使用误区

那是不是所有的 filter 就会加速呢?再看下面这个查询

must 方法

GET indexname/_search
{"query": {"bool": {"must": [{"terms": {"idno": ["2024001Q0001235681","2024001Q0002356812","2024001Q0008197301","2024001Q0002817617"]}}]}}
}


filter 方法

GET indexname/_search
{"query": {"bool": {"filter": [{"terms": {"idno": ["2024001Q0001235681","2024001Q0002356812","2024001Q0008197301","2024001Q0002817617"]}}]}}
}
​


可以看到 2 个查询条件多次查询后,查询耗时差别不大。

并且都产生了 query cache 的使用

must 条件

filter 条件

难道这两个查询都成了 filter context 查询?既然 filter context 的判断依据之一是查询条件是否算分,就可以使用 "explain": true 进行进一步分析。

must 方法

filter 方法

可以看到查询方法在 ES 这里做了隐性的转换。这两个查询对应的底层查询方法为 ConstantScore,而 ConstantScore 也是可以被认为是 filter context 的一种。因此这里的 must 查询也达到 filter 查询使用 querycache 的优势。

校验思路

  • cache 数据
GET indexname/_stats?human=true&filter_path=*.*.query_cache

也可以通过简单安装一个 INFINI Console(https://docs.infinilabs.com/console/main/docs/getting-started/install/) 进行图表监控(在监控图表-索引-advance 中)

  • 查询使用的算分方法
    利用 explain API 判断查询语句是否转换成符合 filter context 的类型,比如是否转换成了 constant score,或者算分规则被消除了,等等
GET indexname/_search
{"explain": true,"query": {"bool": {"filter": [{"terms": {"idno": ["2024001Q0001235681","2024001Q0002356812","2024001Q0008197301","2024001Q0002817617"]}}]}}
}

作者:金多安,极限科技搜索运维专家,Elastic 认证专家,搜索客社区日报责任编辑。一直从事与搜索运维相关的工作,日常会去挖掘 ES / Lucene 方向的搜索技术原理,保持搜索相关技术发展的关注。
原文:https://infinilabs.cn/blog/2024/elasticsearch-filter-context-practice/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/858431.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

产品发展的六阶段

一个成熟的互联网产品从最初的创意到完全成熟,通常需要经历以下几个主要阶段。每个阶段都有特定的目标、核心任务和关键成果,以下是详细的解析。 一、创意阶段 1、创意阶段的核心目标 1.1 识别用户需求 创意阶段的首要任务是发现并明确目标用户的痛点和需求。通过市场调研、…

【unity]学习制作类银河恶魔城游戏-2-

导入新资产切割新资产切割完成修改大小和清晰度球体已经设置了刚体和碰撞体积,直接应用给人物,改名circle为player中心点问题 因为切割的原因,碰撞模型的中心点和人物的中心点不相吻合解决:在子路径下渲染人物图片,将二者的中心点手动对齐手动对齐保存更改更改碰撞体模型运…

DevNow x Notion

DevNow x Notion: DevNow 支持了 Notion 作为其文档系统,可以帮助用户在 Notion 更高效地管理文档,实现文档的集中管理和协作。前言 Notion 应该是目前用户量比较大的一个在线笔记软件,它的文档系统也非常完善,支持多种文档格式,如 Markdown、富文本、表格、公式等。 早期…

平安夜吃苹果

祝大家平安夜快乐 有一棵特殊的苹果树,一连 n 天,每天都可以长出若干个苹果。在第 i 天,树上会长出 apples[i] 个苹果,这些苹果将会在 days[i] 天后(也就是说,第 i + days[i] 天时)腐烂,变得无法食用。也可能有那么几天,树上不会长出新的苹果,此时用 apples[i] == 0 …

基于Three.js的大屏3D地图(一)

依赖安装 yarn add three yarn add @types/three yarn add d3-geothree库安装后在node_modules下其还包含核心three/src和插件three/example/jsm的源码,在开发调试时可以直接查阅。使用Three.js过程中会涉及到许多的类、方法及参数配置,所以建议安装@types/three库;不仅能提…

Java 变量和运算符

Java 变量和运算符1. 变量(Variable)1.1 何为变量 1.2 数据类型(Data Types)1.2.1 整型:byte、short、int、long 1.2.2 浮点类型:float、double 1.2.3 字符类型:char 1.2.4 布尔类型:boolean1.3 变量的使用1.3.1 步骤1:变量的声明 1.3.2 步骤2:变量的赋值1.4. 基本数…

k8s阶段10 k8s指标流水线, 自定义流水线和HPA

1 Kubernetes指标流水线 资源指标Kubernetes有一些依赖于指标数据的组件,例如HPA和VPA等Kubernetes使用Metrics API暴露系统指标给这些组件 #只暴露nodes和pods上的内存,CPU指标该API仅提供CPU和内存相关的指标数据负责支撑Metrics API、生成并提供指标数据的组件,成为核心指标…

目标检测数据集标注工具 CVAT 使用方法【转载】

目标检测数据集标注工具 CVAT 使用方法 原文地址,RSMX-Blog www.cnblogs.com/rsmx/CVAT在线网站(上传下载较慢,数据集较大时不建议使用):https://cvat.org/ CVAT本地部署方法(Linux):https://zhuanlan.zhihu.com/p/388477205官网地址:https://www.cvat.ai/ 1. 使用邮…

浏览器基础知识点(二)

一、浏览器输入一个URL并enter时,发生了什么?用户在浏览器输入一个URL,并按下enter键时,里面包含了非常多的技术细节。 第一,DNS解析: 用户输入的URL通常会是一个域名地址,直接通过域名是无法找到服务器的,因为服务器的本质上是一台拥有IP地址的主机。 需要通过DNS服务…

Gamma阶段——第14周Scrum Meeting记录

Gamma阶段——第14周Scrum Meeting记录 1.目前进度: (1)完成沙盒模式开发,在此基础上加入了笔记,背景音乐,操作说明等辅助功能; (2)完成关卡模式的开发,可以对玩家搭建的电路进行真值表检测; (3)完整游戏系统的整体开发,可以初步实现面向玩家的使用; (4)撰写游…

CPU的实现

CPU实现CPU的数据通路module CPU(input[15:0] inM, // M value input (M = contents of RAM[A])instruction, // Instruction for executioninput clock, reset, // Signals whether to re-start the current// program (reset==1) or continue executing// th…