文档章节

Elasticsearch的filter的caching(缓存)机制详解

o
 osc_kq4xzgbe
发布于 07/01 10:21
字数 935
阅读 26
收藏 0

精选30+云产品,助力企业轻松上云!>>>

 

编程界的小学生 2017-12-27 07:50:54

直接举例说明


1.假设现在要在倒排索引中去搜索字符串(xxx)

比如如下有个倒排索引列表:

Elasticsearch的filter的caching(缓存)机制详解


我现在要搜索:2017-02-02

去倒排索引中找,发现对应的document list是doc2和doc3

2.为每个在倒排索引中搜索到的结果,构建一个bitset

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

[0,1,1]

doc1:不匹配这个filter的

doc2和doc3:匹配这个filter的

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

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

一次性其实可以在一个search请求中,发出多个filter条件,每个filter条件都会对应一个bitsite,遍历每个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,就可以将doc4作为结果返回给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

lter针对小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

o
粉丝 0
博文 64
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
(转)ElasticSearch教程——汇总篇

https://blog.csdn.net/gwd1154978352/article/details/82781731 环境搭建篇 ElasticSearch教程——安装 ElasticSearch教程——安装Head插件 ElasticSearch教程——安装IK分词器插件 Elasti...

osc_0lrxxjv2
2019/04/15
34
0
打造互联网企业架构相关技术(实战干货)

打造互联网企业架构相关技术(实战干货)

chenshiying007
03/31
0
0
最近博客地址汇总

更多干货 更多干货 更多干货 分布式 实战(干货) 更多干货 spring cloud spring cloud 实战(干货) 更多干货 mybatis 更多干货 vue 学习 RPC spring boot spring boot 实战(干货) 更多干...

chenshiying007
03/31
0
0
elasticsearch中文文档

Getting Started(入门指南) + Setup Elasticsearch(设置) + 重大改变 + API 规范 + Document APIS + Search APIs + Aggregations + 索引 API + cat APIs + 集群 API + 查询 DSL + Mappin......

糖果01
2018/12/18
651
0
Elasticsearch学习笔记(十二)filter与query

一.keyword 字段和keyword数据类型 1、测试准备数据 POST/forum/article/_bulk { "index": { "_id": 1}} { "articleID" : "XHDK-A-1293-#fJ3","userID" : 1, "hidden": false, "postDate": "......

osc_2q5en9un
2018/02/05
2
0

没有更多内容

加载失败,请刷新页面

加载更多

Kafka如何在千万级别时优化JVM GC问题?

大家都知道Kafka是一个高吞吐的消息队列,是大数据场景首选的消息队列,这种场景就意味着发送单位时间消息的量会特别的大,那既然如此巨大的数据量,kafka是如何支撑起如此庞大的数据量的分发...

hummerstudio
06/18
6
0
我打赌!90%程序员都破解不了这个粽子,不信你试!

放假了 各位读者朋友们,马上就是端午小长假啦,开心激动有木有? 新的故事文章还在创作中,写了初稿感觉不太满意又推倒重来。其实写故事还是挺难的,读者可能第一次第二次有新鲜感,写多了就...

轩辕之风
06/24
20
0
如何删库跑路?教你使用Binlog日志恢复误删的MySQL数据

前言 “删库跑路”是程序员经常谈起的话题,今天,我就要教大家如何删!库!跑!路! 开个玩笑,今天文章的主题是如何使用Mysql内置的Binlog日志对误删的数据进行恢复,读完本文,你能够了解...

后端技术漫谈
01/14
22
0
PHP设计模式之代理模式

PHP设计模式之代理模式 代理人这个职业在中国有另外一个称呼,房产经济人、保险经济人,其实这个职业在国外都是叫做房产代理或者保险代理。顾名思义,就是由他们来帮我们处理这些对我们大部分...

硬核项目经理
2019/09/23
7
0
Redis的复制模式

Redis的复制功能分为同步(sync)和命令传播(command propagate)两个操作。 同步 同步操作用于将从服务器的数据库状态更新至主服务器当前所处的数据库状态。 1. 旧版本的执行步骤 从服务器...

osc_s9cni3go
29分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部