博客
关于我
Elasticsearch 之(16)_filter执行原理深度剖析(bitset机制与caching机制)
阅读量:788 次
发布时间:2023-01-24

本文共 1668 字,大约阅读时间需要 5 分钟。

倒排索引与过滤器优化技术

倒排索引是一种高效的文档检索机制,通过将文档内容预处理并构建索引,能够快速定位符合特定条件的文档。在实际应用中,过滤器(Filter)的使用可以显著提升检索效率。本文将详细介绍倒排索引中使用过滤器的实现方法及其优化策略。

(1)倒排索引中的关键术语

以日期(date)和单词(word)为例,倒排索引存储了每个单词在不同文档中的出现位置和对应的文档ID。具体展示如下:

word        doc1  doc2  doc3---------   ----- ----- -----2017-01-01 *2017-02-02 *2017-03-03 *

通过搜索“2017-02-02”,倒排索引返回匹配该日期的文档列表为doc2和doc3。

(2)bitset的定义与作用

bitset是一种用来标记文档与过滤条件匹配情况的二进制数组。数组中的每个元素要么为0(不匹配),要么为1(匹配)。基于找到的文档列表,bitset可以反映哪些文档符合当前过滤条件。例如:

bitset = [0, 1, 1]

这表示doc1不匹配,doc2和doc3匹配。

(3)过滤器优化策略

在实际应用中,过滤器的使用可以通过以下方式优化:

  • 优先遍历稀疏bitset

    越稀疏的bitset越可能过滤掉更多文档。例如:

    比较稀疏:[0, 0, 0, 1, 0, 0]稍微稀疏:[0, 1, 0, 1, 0, 1]

    优先处理稀疏的bitset可以快速缩小结果范围。

  • 遍历所有bitset,找到完全匹配的文档

    需要同时满足所有过滤条件的文档,才视为最终结果。例如:

    -过滤条件:

    postDate=2017-01-01,对应的bitset为 [0, 0, 1, 1, 0, 0]userID=1,对应的bitset为 [0, 1, 0, 1, 0, 1]

    最终匹配的文档为doc4。

  • 缓存策略

    为提高性能,可以对频繁查询的过滤条件进行缓存:

    • 缓存条件:如果某个过滤条件在最近256个查询中出现次数超过一定阈值,则缓存其bitset。
    • 适用场景:对于小段段(即段的大小小于1000或占总段数的3%),由于段很快会与其他小段合并,缓存意义不大。小段的bitset可以直接 scanner 扫描,无需缓存。

    例如,小段bitset [0, 0, 1, 0] 可以直接生成,无需缓存。

  • (4)缓存机制的注意事项

  • 自动更新

    文档增减或修改时,相关的bitset会自动更新。例如:

    • 文档id=5,更新日期为2017-01-01,其对应的bitset变为 [0, 0, 1, 0, 1]
    • 文档id=1,日期修改为2017-01-01,其bitset变为 [1, 0, 1, 0, 1]
  • ** filter caching**

    过滤条件并不是直接缓存文档结果,而是缓存bitset。这意味着下次同一个过滤条件出现时,不需要重新扫描倒排索引,可以直接使用预先生成的bitset。

  • (5)filter在查询中的角色

  • 过滤作用

    过滤器的作用是快速过滤掉不符合条件的文档,而不是计算相关性得分或排序。因此,filter操作比查询更高效。

  • 补充说明

    查询操作不仅计算文档与搜索条件的相关性得分,还会根据得分对结果进行排序。而filter操作仅负责过滤数据。

  • (6)定期更新与维护

    为了确保过滤器的准确性,需要定期更新缓存的bitset:

    • 文档新增或修改时,相关的过滤条件对应的bitset会被自动更新。
    • 如果文档属于小段,可以直接 scanner 扫描,无需缓存(小段很快会被合并)。

    整个过程旨在通过过滤器优化文档检索,提升系统的性能和效率。

    总结

    倒排索引与过滤器的结合使用,能够显著提升文档检索效率。通过构建bitset、优化查询顺序以及采用缓存策略,可以省去不必要的扫描工作,提升系统性能。对于频繁查询的过滤条件,可以通过缓存其bitset,进一步优化性能。这一机制不仅节省内存空间,还能提升文档检索的速度,使得系统更加高效和用户体验更加优良。

    转载地址:http://beeyk.baihongyu.com/

    你可能感兴趣的文章
    2025版最新开发一款大模型需要经过哪些步骤?开发一款大模型的完整流程,收藏这篇就够了
    查看>>
    $.inArray函数判断数组中的是否包含字符串
    查看>>
    2025版最新渗透测试和黑客工具列表,零基础入门到精通,收藏这一篇就够了
    查看>>
    2025版最新网络安全入门书籍整理大全,零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新网络安全知识入门及学习流程(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新网络安全等级保护测评指南,零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新运维怎么转行网络安全?零基础入门到精通,收藏这篇就够了
    查看>>
    2025版最新黑客学习网站(非常详细),零基础入门到精通,看这一篇就够了
    查看>>
    2025版网络工程11个高含金量证书(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>
    2025自学成为黑客必读的5本书籍,带你从小白进阶成大佬
    查看>>
    20万高薪专业-网络安全(非常详细)零基础入门到精通,收藏这一篇就够了
    查看>>
    23张图告诉你组建一个网络需要用到哪些硬件设备?路由器、交换机、防火墙是不是就够了?
    查看>>
    24 WEB漏洞-文件上传之WAF绕过及安全修复_阿里云盾waf绕过怎么修复
    查看>>
    #12 btrfs文件系统
    查看>>
    #3194. 去月球
    查看>>
    24.线程
    查看>>
    #Leetcode# 28. Implement strStr()
    查看>>
    2022年课时四Servlet 中常用<Servlet>常用对象
    查看>>
    $route 和 $router详解、区别、示例代码
    查看>>
    $scope angular在controller之外调用
    查看>>