大数据(Hadoop,Spark,Flink,Storm,Hive,Hbase...)

ES的filter原理

2018-09-03  本文已影响315人  明翼

0、说明

并非原创,按照中华石杉视频讲解整理。

1、filter和query区别

简单来说query查询的时候会去计算下查询表达式和文档的匹配程度得分,得分越高的排的越靠前,而filter不会,filter是仅仅做过滤。

2、filter过程

1)在倒排索引中查找搜索串,获取document list
举个简单例子,列下倒排索引表如下:
历史->doc1、doc2
地址->doc1 、doc3
政治-> doc1、doc2、doc3
假设搜索“历史”,在倒排索引表中查找为doc1和doc2。

2)为每个倒排索引搜索结果,构建bitset。
如果大家了解布隆过滤,bitset就类似于布隆过滤器,简单来说用一个长数组表示匹配还是不匹配,匹配为1 不匹配为0,这样达到快速过滤的目的。
bitset就是这样的一个数组[1、0、0、1],1表示匹配,0表示不匹配。

3)遍历每个bitset,优先从最稀疏的bitset开始遍历,查找满足所有条件的docs
所谓稀疏的bitset 即是匹配到最少文档的bitset,也即bitset里面1的个数最少的。

4)然后通过获取bitset对应的id,然后找到对应的结果返回给客户端。

5)bitset是会被cache的,这样下次用同样的条件查询,可以迅速得到结果,对于小的segment(<1000 docs或者 小于index大小的3%的)不缓存bitset。
主要原因:
1)小段本身扫描很快。
2)小段有大几率会发生合并,合并后。
bitset缓存起来的不是完整结果,只是不用再次扫描倒排索引而已。

6)filter操作基本要在query之前,因为可以过滤更多的数据。

7)如果doc有更新或新增操作,cache的bitset会自动更新。

8)以后只要有相同的filter条件,可以直接使用cache的bitset。

上一篇下一篇

猜你喜欢

热点阅读