• @Elasticsearch之深度应用及原理剖析--Filter过滤机制剖析(bitset机制与caching机制)



    title: ElasticSearch之深度应用及原理剖析
    author: Xoni
    tags:

    • 搜索引擎
    • Elasticsearch
      categories:
    • 搜索引擎
    • Elasticsearch
      abbrlink: 5a1f6e0b

    第1节 索引文档写入和近实时搜索原理

    在这里插入图片描述

    第9节 Filter过滤机制剖析(bitset机制与caching机制)

    1. 在倒排索引中查找搜索串,获取document list

    解析:
    date举例:倒排索引列表,过滤date为2020-02-02(filter:2020-02-02)。
    去倒排索引中查找,发现2020-02-02对应的document list是doc2、doc3。

    2. Filter为每个在倒排索引中搜索到的结果,构建一个bitset,[0, 0, 0, 1, 0, 1](非常重要)

    解析:

    1. 使用找到的document list,构建一个bitset(二进制数组,用来表示一个document对应一个filter条件是否匹配;匹配为1,不匹配为0)。
    2. 为什么使用bitset:尽可能用简单的数据结构去实现复杂的功能,可以节省内存空间、提升性能。
    3. 由上步的document list可以得出该filter条件对应的bitset为:[0, 1, 1];代表着doc1不匹配filter,doc2、doc3匹配filter

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

    document
    解析:

    1. 多个filter组合查询时,每个filter条件都会对应一个bitset。
    2. 稀疏、密集的判断是通过匹配的多少(即bitset中元素为1的个数)[0, 0, 0, 1, 0, 0] 比较稀疏、[0,1, 0, 1, 0, 1] 比较密集 。
    3. 先过滤稀疏的bitset,就可以先过滤掉尽可能多的数据。
    4. 遍历所有的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。
    5. 将得到的document作为结果返回给client。

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

    解析:

    1. 比如postDate=2020-01-01,[0, 0, 1, 1, 0, 0];可以缓存在内存中,这样下次如果再有该条件查询时,就不用重新扫描倒排索引,反复生成bitset,可以大幅提升性能。
    2. 在最近256个filter中,有某个fiflter超过一定次数,次数不固定,就会自动缓存该filter对应的bitset。
    3. filter针对小segment获取的结果,可以不缓存,segment记录数<1000,或者segment大小
    4. filter比query的好处就在于有caching机制,filter bitset缓存起来便于下次不用扫描倒排索引。以后只要是由相同的filter条件的,会直接使用该过滤条件对应的cached bitset
      比如postDate=2020-01-01,[0, 0, 1, 1, 0, 0];可以缓存在内存中,这样下次如果再有该条件查询时,就不用重新扫描倒排索引,反复生成bitset,可以大幅提升性能。

    5. 如果document有新增或修改,那么cached bitset会被自动更新

    示例:postDate=2020-01-01,filter:[0, 0, 1, 0]

    • 新增document,id=5,postDate=2020-01-01;会自动更新到postDate=2020-01-01这个filter的bitset中,缓存要会进行相应的更新。postDate=2020-01-01的bitset:[0, 0, 1, 0, 1]。
    • 修改document,id=1,postDate=2019-01-31,修改为postDate=2020-01-01,此时也会自动更新bitset:[1, 0, 1, 0, 1]。

    6. filter大部分情况下,在query之前执行,先尽量过滤尽可能多的数据

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

  • 相关阅读:
    人工智能——图像处理和Python深度学习的全教程(建议收藏)
    SpringMVC处理Ajax请求及处理和响应json格式的数据
    【SpringMVC】RESTful风格CRUD实现
    DKD蒸馏复现
    ZZCMS201910——二次安装漏洞
    C语言 深度探究C语言中的多文件项目
    【附源码】计算机毕业设计JAVA移动电商网站
    【docker - 安装】windows 10 专业版 安装docker,以及 WSL kernel version too low 解决方案
    云原生Kubernetes系列 | init container初始化容器的作用
    最近很火的AIGC人工智能之AI赋能运营(巧用ChatGPT轻松上手新媒体)
  • 原文地址:https://blog.csdn.net/weixin_45992021/article/details/127041115