Elasticsearch的search之_shards skipped之谜

article/2025/9/20 8:15:45

es从 v5.6 开始引入了 pre-filter 机制(skipped):对于 Date 类型的 Range 查询,在对分片执行搜索之前,先检查一下分片是否包括被查询的数据范围,如果查询的范围与分片持有的数据没有交集,就跳过该分片。

"_shards":{
    "total": 130,
    "successful": 130,
    "skipped": 2,
    "failed": 0
}

skipped

(Integer) Number of shards that skipped the request because a lightweight check helped realize that no documents could possibly match on this shard. This typically happens when a search request includes a range filter and the shard only has values that fall outside of that range.

基本原理

搜索过程原先由两个阶段执行(查询阶段和取回阶段)变成三个阶段(新增:预过滤阶段【pre-filter】),pre-filter 在查询阶段之前执行。

怎样预过滤?

协调节点收到客户端的查询请求后,向本次搜索涉及到的全部分片发送RPC请求:indices:data/read/search[can_match],每个节点收到请求后,判断请求的范围和待查询的分片是否存在交集,返回是或否,然后协调节点跳过不存在交集的分片,向其他分片发送下一阶段(查询阶段)的请求。

这次 RPC 请求以 shard 为单位并行发送,没有并发限制。待查询的 shard 有多少个,就并发发送多少个 RPC。然后等待全部 RPC 返回响应。

此时发送的 RPC 请求没有超时限制。事实上,_search 请求的 timeout参数仅在整个分布式搜索的 query 阶段进行检查,并且不包括 PRC 层面,他只在数据节点收到协调节点发来的 RPC 后开始计时,检查 query 过程是否超时。fetch 阶段的 RPC,以及数据节点对 fetch 请求的处理均没有超时检查。

什么情况下会执行?

pre-filter 并不会在所有查询过程中执行,在 v7.4中,需要同时满足以下条件,才会执行 pre-filter :

  • 待查询的分片数大于 128(在url中指定pre_filter_shard_size)
  • 聚合请求不要求访问所有 doc。即非 Global Aggregation 或 "min_doc_count" 不为0

另外,非 Date 类型的数值查询虽然也会走 pre-filter流程,但内部不会去判断范围,虽然协调节点也会发送 can_match 的 RPC,但数据节点的响应会在 MappedFieldType#isFieldWithinQuery 中直接返回相交,所以没有分片会被 skip,未来这方面可能会有扩展。

关于pre-filter 的实现原理

它依赖于 Lucene 的一个重要特性:PointValues ,在早期的版本中数值类型当字符串存入倒排索引但范围查询效率比较低,从 Lucene 6.0开始数值类型使用 BKD-Tree 来建立索引(PointValues,它在多维、一维数值查询很棒,IntField->IntPoint,LongField->LongPoint......)

关于BKD-Tree笔者理解也不深刻,看源码也是稍微领略其中要到,Lucene为每个数值字段建立索引,这个索引就是一个二叉树,我们知道一个Index由多个Segment组成,每个Segment中每个数值字段的索引即为一个KDB-Tree,在Segment Merge的过程中,多个KDB-Tree会进行合并,生成一个较大的KDB-Tree。最重要的是:可以轻松获取到每个 segment 中该字段的最大值和最小值,reader读取某个segment 时, 内部的 BKDReader 会将最大值和最小值读取出来常驻 JVM 内存。

因此, pre-filter 只在 Date 类型的Range 查询里实现了,因为 Date 类型的数值确定是递增的,其他数值类型未必。对于非递增的数值字段,其数据会散布到 my_index-* 的每个分片上,因此 pre-filter 也就没有必要了。

Elasticsearch内部实现非常复杂,因此我们在学习它的时候,要大胆推测,细心验证,才能领会其中要领。

参考:

  • Lucene 内核解析之Point索引
  • 索引文件的读取
  • PointValues 取代了NumericField
  • Add a shard filter search phase to pre-filter shards based on query rewriting

http://chatgpt.dhexx.cn/article/Oan9gbx5.shtml

相关文章

Cadence常见问题:Analysis was skipped due to inability to compute operating point?

题主使用门电路创建sr触发器电路图如下: 欲在sr端加电压pulse验证sr输出特性,遇到以下报错: 显示输出不收敛 解决方法: 题主是直接调用ahdlLib中的或非门,是理想或非门,所以造成不收敛的问题 用晶体管自己搭…

linux 使用rz命令上传文件失败skipped by remote

一、背景 linux 通过rz命令上传 文件,显示xx skipped by remote 点击任意键后,文件并没有上传成功 二、解决方案 应该是权限问题,我当前并不是超级权限, 先切换超级权限 sudo su - 然后再上传 文件就可以了

SparkUI中显示stage skipped的原因【源码分析】

SparkUI中显示stage skipped的原因【源码分析】 Spark Job的ResultStage的最后一个Task成功执行之后,DAGScheduler.handleTaskCompletion方法会发送SparkListenerJobEnd事件,源码如下:JobProgressListener.onJobEnd方法负责处理SparkListener…

unprintable character xxxx skipped解决方案

在keil软件中输入源代码的时候 常常会出现上述错误 双击蓝色那一条文字 -----到34行处 可以发现注释中间的分号是在中文状态下 而在这里面我们只能用英文状态下的分号 所以将分号改为英文状态下的分号即可 若实在不行 就直接删除注释~~~

spark web ui中的skipped的含义

顾名思义,跳出的意思啦。 例如如图: skipped的stages代表是已经执行过了。所以不需要再执行了。 如何,你有一个 testRdd。然后先做 testRdd.Filter("xxx").map("xx"), 这个是transform 然后再分别做了count和…

svn的skipped,no versioned parent报错解决方法

http://blog.csdn.net/lanjinghai507/article/details/52327636 感谢分享 今天一大早,习惯性的用sublime_text,选择文件夹,然后删除该文件,再然后跟新,接着就出现skipped,no versioned parent的报错,如下图 skipped…

ntohs和htons的区别

虽然注册CSDN已经有好几年了,学习写程序也有两年的时间了。对于绝大数人来说,我还是得菜鸟。平时遇到什么问题也会来到这个平台搜索别人的解答。也从这个平台上获益很多。 今天在公司因为一个问题和同事就关于htons与ntohs有没有区别探讨了一下&#xff…

socket编程中的 htons()

文章目录 1.内存存储数据的方式1.1 数据字节序号1.2 小端字节序1.3 大端字节序 2. 转换顺序2.1 网络字节序2.2 主机字节序2.3 转换函数 在刚刚接触 socket 时,遇到了 htons() 函数,就直接懵逼了,这是什么东西,有什么用&#xff1f…

高并发解决方案——Redis(一)

简介 Redis作为重要的缓存数据库在高并发的解决方案中起着重要作用。为了系统的学习Redis,也为了秋招(美团比较关注Redis 的掌握),计划编写该系列博客,也是为了整理知识点。 本篇主要介绍了Redis的基础知识与原理。之…

Jmeter超高并发解决方案

背景一亿用户量,平均每人每天10次的业务量,要求并发数在5000以上,峰值在5w到10w之间,QPS在25w以上 一、jmeter解决高并发的优化方案 1.1 优化监听(GUI模式,尽量不考虑) …

2023春招面试专题:高并发解决方案

如何理解高并发? 高并发意味着大流量,需要运用技术手段抵抗流量的冲击,这些手段好比操作流量,能让流量更平稳地被系统所处理,带给用户更好的体验。 我们常见的高并发场景有:淘宝的双11、春运时的抢票、微…

高并发解决方案之熔断处理

高并发解决方案之熔断处理 前言概念基本介绍三种状态熔断方式常用框架功能对比使用介绍 参考链接 前言 问题列表 跨系统、跨服务调用第三方接口时,第三方接口响应超时或者服务不可用,发生连锁故障进而导致雪崩效应。 举例说明 假设上游服务是A&#xff…

阿里云高并发解决方案

今天这篇帖子我会讲解一下金蝶财务软件K3_CLOUD高并发部署在阿里云上得解决方案,本篇博客同样适用于其他软件高并发上云部署 以我去年12月份的一个客户项目为例。 做过项目的朋友都知道,小客户比较关注的是成本,大客户关注的是价值和服务。高并发客户一般都会有专业的IT运…

高并发解决方案相关面试题

什么是DNS解析域名 DNS域名解析就是讲域名转化为不需要显示端口(二级域名的端口一般为80)的IP地址,域名解析的一般先去本地环境的host文件读取配置,解析成对应的IP地址,根据IP地址访问对应的服务器。若host文件未配置…

Token高并发解决方案

Token高并发解决方案 一:作为token使用的第三方 客户端模式使用token 可以采用单例模式或定义一个全局变量isRefresh 标志,加同步锁Synchronized来保证token过期的那个时间点,刷新token方法只被调用一次。 二:作为token服务器端…

大数据和高并发解决方案

一、网站应用背景 开发一个网站的应用程序,当用户规模比较小的时候,使用简单的:一台应用服务器一台数据库服务器一台文件服务器,这样的话完全可以解决一部分问题,也可以通过堆硬件的方式来提高网站应用的访问性能&…

电商中常见的高并发解决方案

目录 多级缓存 什么叫多级缓存 多级缓存的实现思路 Redis 缓存同步 MySql 数据 Nginx 限流 什么是限流 常见的限流算法之漏桶算法 nginx 限流的方式 控制速率 控制并发量(连接数) 在本文中,我们将以京东为例,了解电商中…

【数据科学】斯皮尔曼的等级相关系数(Spearman's coefficient)

在统计数据中,斯皮尔曼的等级相关系数或斯皮尔曼的rho,以查尔斯斯皮尔曼命名并经常用希腊字母表示或,是秩相关的非参数度量(两个变量的排名之间的统计依赖性)。它评估了使用单调函数描述两个变量之间关系的程度。 两个…

python 利用Scipy计算person 和spearman相关系数

python 利用Scipy计算person 和spearman相关系数 觉得有用的话,欢迎一起讨论相互学习~ 学习以下两位大佬的讲解 (Pearson)皮尔逊相关系数和spearman相关系数(附python实现) 相关性系数及其python实现 皮尔逊相关系数 下面是皮尔逊相关系数的计算公式…

Python+pandas计算数据相关系数(person、Kendall、spearman)

pandas中DataFrame对象corr()方法的用法,该方法用来计算DataFrame对象中所有列之间的相关系数(包括pearson相关系数、Kendall Tau相关系数和spearman秩相关)。 pandas相关系数-DataFrame.corr()参数详解 DataFrame.corr(methodpearson, min_p…