1.倒排索引
在倒排索引中查找搜索串,获取document list
- 用时间类型date作为filter来举例, filter:2017-02-02
- 倒排索引如下:
word | doc1 | doc2 | doc3 |
---|---|---|---|
2017-01-01 | √ | √ | |
2017-02-02 | √ | √ | |
2017-03-03 | √ | √ | √ |
到倒排索引中一找,发现2017-02-02对应的document list是doc2,doc3
2.为每个在倒排索引中搜索到的结果,构建一个bitset
其中个bitset 如下,其中0表示未匹配,1 表示匹配
[0, 1, 1]
doc1不匹配
doc2和doc3匹配这个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
然后将doc4作为结果返回给client
4.caching bitset
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