es filter过滤的bitset机制和caching机制

Posted parent-absent-son

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了es filter过滤的bitset机制和caching机制相关的知识,希望对你有一定的参考价值。

 

document存储数据为:

PUT /forum/article/_bulk
 "index":  "_id": 1 
 "articleID" : "XHDK-A-1293-#fJ3", "userID" : 1, "hidden": false, "postDate": "2017-01-01" 
 "index":  "_id": 2 
 "articleID" : "KDKE-B-9947-#kL5", "userID" : 1, "hidden": false, "postDate": "2017-01-02" 
 "index":  "_id": 3 
 "articleID" : "JODL-X-1937-#pV7", "userID" : 2, "hidden": false, "postDate": "2017-01-01" 
 "index":  "_id": 4 
 "articleID" : "QQPX-R-3956-#aD8", "userID" : 2, "hidden": true, "postDate": "2017-01-02" 

查询语句(获取userid==1 && postDate==2017-01-01的document 并且articleID包含XHDK):

GET /forum/article/_search

  "query":
    "bool":
      "filter": [
        "term":  "hidden": "false",
        "term": "postDate": "2017-01-01" ,
"match": "articleID":   "XHDK"
      ]
   
 

此语句查询过程,涉及到caching和bitset部分。

bitset机制

(1) 在倒排索引中查找字符串,获取documnet list。

(2)位每个在倒排索引中搜索到的结果,构建一个bitset。0代表不匹配,1代表匹配,使用bitset这种数据结构可以节省内存空间,提升性能。

"term":   "hidden": "false"------>[1,1,1,0]
"term":  "postDate": "2017-01-01" ----> [1,0,1,0]
"match":  "articleID":   "XHDK"------> [1,0,0,0]

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

最稀疏的应该是"match":  "articleID":   "XHDK"------> [1,0,0,0]。这样可以尽可能多的过滤掉documnet。
再过滤"term": "postDate": "2017-01-01" ----> [1,0,1,0]
遍历完后bitset之后,找到所有匹配的document。[1,0,0,0],也就是document==1一个。

caching机制

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

使用缓存,可以不用重新扫描倒排索引,不用反复生成bitset,可以大幅度提升性能。

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

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

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

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

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

 

参考文档:https://www.jianshu.com/p/83e4771f697e

以上是关于es filter过滤的bitset机制和caching机制的主要内容,如果未能解决你的问题,请参考以下文章

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

[ElasticSearch2.x]Filter之Cache

Elastic Search中filter的理解

es的三种缓存

ES 23 - 检索和过滤的区别 (query vs. filter)

es6 filter() 数组过滤方法总结