elasticsearch中filter执行原理深度剖析(bitset机制与caching机制)

程欢欢的博客园 程欢欢的博客园     2022-09-21     235

关键词:


(1)在倒排索引中查找搜索串,获取document list

date来举例

word        doc1   doc2      doc3

2017-01-01     *     *
2017-02-02           *        *
2017-03-03     *       *        *

filter:2017-02-02

到倒排索引中一找,发现2017-02-02对应的document list是doc2,doc3

(2)为每个在倒排索引中搜索到的结果,构建一个bitset,[0, 0, 0, 1, 0, 1]

非常重要

使用找到的doc list,构建一个bitset,就是一个二进制的数组,数组每个元素都是0或1,用来标识一个doc对一个filter条件是否匹配,如果匹配就是1,不匹配就是0

[0, 1, 1]

doc1:不匹配这个filter的
doc2和do3:是匹配这个filter的

尽可能用简单的数据结构去实现复杂的功能,可以节省内存空间,提升性能

(3)遍历每个过滤条件对应的bitset,优先从最稀疏的开始搜索,查找满足所有条件的document

后面会讲解,一次性其实可以在一个search请求中,发出多个filter条件,每个filter条件都会对应一个bitset
遍历每个filter条件对应的bitset,先从最稀疏的开始遍历

[0, 0, 0, 1, 0, 0]:比较稀疏
[0, 1, 0, 1, 0, 1]

先遍历比较稀疏的bitset,就可以先过滤掉尽可能多的数据

遍历所有的bitset,找到匹配所有filter条件的doc

请求:filter,postDate=2017-01-01,userID=1

postDate: [0, 0, 1, 1, 0, 0]
userID: [0, 1, 0, 1, 0, 1]

遍历完两个bitset之后,找到的匹配所有条件的doc,就是doc4

就可以将document作为结果返回给client了

(4)caching bitset,跟踪query,在最近256个query中超过一定次数的过滤条件,缓存其bitset。对于小segment(<1000,或<3%),不缓存bitset。

比如postDate=2017-01-01,[0, 0, 1, 1, 0, 0],可以缓存在内存中,这样下次如果再有这个条件过来的时候,就不用重新扫描倒排索引,反复生成bitset,可以大幅度提升性能。

在最近的256个filter中,有某个filter超过了一定的次数,次数不固定,就会自动缓存这个filter对应的bitset

segment(上半季),filter针对小segment获取到的结果,可以不缓存,segment记录数<1000,或者segment大小<index总大小的3%

segment数据量很小,此时哪怕是扫描也很快;segment会在后台自动合并,小segment很快就会跟其他小segment合并成大segment,此时就缓存也没有什么意义,segment很快就消失了

针对一个小segment的bitset,[0, 0, 1, 0]

filter比query的好处就在于会caching,但是之前不知道caching的是什么东西,实际上并不是一个filter返回的完整的doc list数据结果。而是filter bitset缓存起来。下次不用扫描倒排索引了。

(5)filter大部分情况下来说,在query之前执行,先尽量过滤掉尽可能多的数据

query:是会计算doc对搜索条件的relevance score,还会根据这个score去排序
filter:只是简单过滤出想要的数据,不计算relevance score,也不排序

(6)如果document有新增或修改,那么cached bitset会被自动更新

postDate=2017-01-01,[0, 0, 1, 0]
document,id=5,postDate=2017-01-01,会自动更新到postDate=2017-01-01这个filter的bitset中,全自动,缓存会自动更新。postDate=2017-01-01的bitset,[0, 0, 1, 0, 1]
document,id=1,postDate=2016-12-30,修改为postDate-2017-01-01,此时也会自动更新bitset,[1, 0, 1, 0, 1]

(7)以后只要是有相同的filter条件的,会直接来使用这个过滤条件对应的cached bitset

elasticsearch教程elasticsearch查询语法elasticsearch权威指南深入理解elasticsearch

课程大纲第1节结构化搜索_IT技术论坛案例背景介绍9分钟第2节结构化搜索_在案例中实战使用termfilter来搜索数据20分钟第3节结构化搜索_filter执行原理深度剖析(bitset机制与caching机制)18分钟第4节结构化搜索_在案例中实战基于bool组... 查看详情

elasticsearch顶尖高手系列-高手进阶篇(最新第二版)

第1节结构化搜索_IT技术论坛案例背景介绍第2节结构化搜索_在案例中实战使用termfilter来搜索数据第3节结构化搜索_filter执行原理深度剖析(bitset机制与caching机制)第4节结构化搜索_在案例中实战基于bool组合多个filter条件来搜索... 查看详情

elasticsearch中filter和query的异同

如下例子,查找性别是女,所在的州是PA,过滤条件是年龄是39岁,balance大于等于10000的文档:{"query":{"bool":{"must":[{"match":{"gender":"F"}},{"match":{"state":"PA"}}],"filter":[{"term":{"age":"39"}},{"range":{"balance":{"gte":"10000"}}}]} 查看详情

3.filter原理(bitset机制与caching机制)

主要知识点: 一次filter执行顺序 filter和query的特点   一、一次filter执行顺序   1、在倒排索引中查找搜索串,获取documentlist 以一下date数据来举例   word         &n 查看详情

es之六:elasticsearch中filter和query的异同

如下例子,查找性别是女,所在的州是PA,过滤条件是年龄是39岁,balance大于等于10000的文档:{"query":{"bool":{"must":[{"match":{"gender":"F"}},{"match":{"state":"PA"}}],"filter":[{"term":{"age":"39"}},{"range":{"balance":{"gte":"10000"}}}]} 查看详情

[elasticsearch2.x]filter之cache

过滤器(Filter)的核心实际是采用一个bitset记录与过滤器匹配的文档。当Elasticsearch确定一个bitset可能会在将来被重用时,它将被直接缓存在内存中供 查看详情

理解elasticsearch的post_filter(代码片段)

欢迎访问我的GitHub本篇概览《Elasticsearch权威指南中,post_filter出现在聚合章节,描述post_filter的作用为:只过滤搜索结果,不过滤聚合结果;描述比较简单,还是用实例来加深理解吧。环境信息以下是本次实例的环境信息,请确... 查看详情

面试深拷贝与浅拷贝的实现原理(代码片段)

文章目录前言1.什么是深拷贝与浅拷贝2.浅拷贝的实现原理3.深拷贝的实现原理3.1实现Cloneable接口3.2使用JSON字符串转换3.3集合实现深拷贝总结前言深拷贝与浅拷贝的问题,也是面试中的常客。虽然大家都知道两者表现形式不同... 查看详情

[elasticsearch]向已存在的索引中加入自己定义filter/analyzer

问题描写叙述随着应用的不断升级,索引中的类型也会越来越多,新添加的类型中势必会使用到一些自己定义的Analyzer。可是通过_settings端点的更新API不能直接在已经存在的索引上使用。在sense中进行更新时会抛出异常:PUT/symbol{... 查看详情

扩展运算符...和map,filter等方法返回的数组是深拷贝么

参考技术A扩展运算符...和map,filter等方法返回的数组是深拷贝么?我们先对扩展运算符做一个测试由上面的测试可以看出,扩展运算符只是部分深拷贝,只是对第一层进行了深拷贝,其他都是浅拷贝我们再对map和filter进行测试... 查看详情

javaweb--filter(过滤器)学习(附加)

一、Filter运行原理解析多个Filter执行顺序  1.一个数组:存放与请求相匹配的所有Filter  2.一个Map:Map的key为<url-pattern>的值,value为Filter实例对象的引用  3.执行原理:当请求到达Web服务器时,会先对该请求进行解析,... 查看详情

elasticsearch(七)——复合查询

参考技术A将查询内部的结果文档得分都设定为1或者boost的值,多用于结合bool查询实现自定义得分bool布尔查询有一个或者多个布尔子句组成filter查询只过滤符合条件的文档,es会有只能缓存,因此其执行效率很高,做简单的匹配... 查看详情

aop的实现原理

...性更灵活,可以随意的删除和添加某些功能!你可以参照filter过滤器,其实filter就是一个很好的对aop的解释参考技术A你问的真够牛逼的!不知道你想知道什么!你是想问Spring中的AOP实现原理。还是问hibernate中哪些地方用了动态... 查看详情

杂谈filterchain相关知识整理(代码片段)

前言  做后台的,Filter肯定没少配置,但是知晓其原理的可能不多。在这之前我也不懂,但这并不影响业务开发,同时也有其他的知识要学,所以一直就没看。这阵子有点闲,刚好在看《HowTomcatWorks》的PipeLine相关内容。索性... 查看详情

elasticsearch内部原理之分布式文档搜索(代码片段)

ElasticSearch版本:2.x这个要比基本的创建-读取-更新-删除(CRUD)请求要难一些。CRUD操作是处理的单个文档。这就意味着我们明确的知道集群中的哪个分片存储我们想要的文档。一个CRUD操作只对单个文档进行处理,文档有唯一的组... 查看详情

elasticsearch:过滤搜索结果-filter及post_filter(代码片段)

在Elasticsearch中,过滤搜索的结果是我们经常要做的事。在我刚开始接触Elasticsearch,我就了解到有两种可以过滤搜索结果的方法。当时还不是很明白,为什么有的地方用filter,而有的地方需要使用到postfilter。在今... 查看详情

elasticsearch-elasticsearch基本概念及集群内部原理(代码片段)

文章目录1.ElasticSearch的应用场景01.Elasticsearch是什么?02.为何使用Elasticsearch?03.Elasticsearch的用途是什么?04.Elasticsearch的工作原理是什么?05.Elasticsearch索引是什么?06.Logstash的用途是什么?07.Kibana的用途是... 查看详情

elasticsearch架构原理

为什么要学习架构?Elasticsearch的一些架构设计,对我们做性能调优、故障处理,具有非常重要的影响。下面将从Elasticsearch的准实时索引的实现、自动发现、rounting和replica的读写过程,shard的allocate控制使文本可以被搜索?在传统... 查看详情