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

  • 在倒排索引中查找搜索串,获取document list
worddoc1doc2doc3
2017-01-01**
2017-01-02**
2017-01-03***

                filter:2017-01-02 ====>到倒排索引中一找,发现2017-01-02对应的document list                         为 doc1  doc2

  • 为每个倒排索引中搜索到的结果,构建一个bitset[1,1,0,0,0]
    • 使用找到的 doc list,构建一个bitset,就是一个二进制数组(尽可能用简单的数据结构实现复杂的功能),数组每个元素都是0或者1,用来表示一个doc对一个filter条件是否匹配,如果匹配就是1,不匹配就是0
    • filter:2017-01-02   ===>   [0,1,1] ==>doc1不匹配,doc2和doc3匹配
  • 遍历每个过滤条件的对应的bitset,优先从最稀疏的开始搜索,先过滤掉尽可能多的数据,查找满足所有条件的document
  • caching bitset, 跟踪query,在最近256个query中超过一定条件的过滤条件,缓存其bitset.对于小segment(<1000或者<3%),不缓存bitset(segment数据量很小,此时哪怕是扫描也很快;segment会在后台自动合并,小segment很快会跟其他小segment合并成打segment,此时缓存也没有扫描意义)
  • filter在query之前执行,先尽量过滤掉尽可能多的数据
  • 如果document有新增或者修改,那么cached bitset会被自动更新
    • 缓存会自动更新:如果 postData=2017-01-01:[0,0,0,1].此时documentId为5也符合这个条件,那么会自动更新到postData=2017-01-01这个filter的bitset中[0,0,0,1,1]
  • 以后只要有相同的filter条件的,会直接来使用这个过滤条件对应的cached bitset的

比较复杂的Demo 

查询articleId为2222,或者articleId为1111而且日期为2017

{

        "query":{

                "constant_score":{

                        "filter":{

                                "bool":{

                                        "should":[

                                               {"term" : {"articleId" :  "2222"}},

                                                {"bool" :

                                                        "must":[

                                                        {"term":{"articleId":"1111"}},

                                                        {"term":{"postDate":"2017"}},

                                                        ]

                                                }

                                        ]

                                }

                        }

                }

        }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值