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

date来举例

word        doc1        doc2        doc32017-01-01    *        *
2017-02-02            *        *
2017-03-03    *        *        *filter:2017-02-02

到倒排索引中一找,发现2017-02-02对应的document list是doc2,doc3

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

非常重要

使用找到的doc list,构建一个bitset,就是一个二进制的数组,数组每个元素都是0或1,用来标识一个doc对一个filter条件是否匹配,如果匹配就是1,不匹配就是0

[0, 1, 1]

doc1:不匹配这个filter的
doc2和do3:是匹配这个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

就可以将document作为结果返回给client了

(4)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

segment(上半季),filter针对小segment获取到的结果,可以不缓存,segment记录数<1000,或者segment大小

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

针对一个小segment的bitset,[0, 0, 1, 0]

filter比query的好处就在于会caching,但是之前不知道caching的是什么东西,实际上并不是一个filter返回的完整的doc list数据结果。而是filter bitset缓存起来。下次不用扫描倒排索引了。

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

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

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

postDate=2017-01-01,[0, 0, 1, 0]
document,id=5,postDate=2017-01-01,会自动更新到postDate=2017-01-01这个filter的bitset中,全自动,缓存会自动更新。postDate=2017-01-01的bitset,[0, 0, 1, 0, 1]
document,id=1,postDate=2016-12-30,修改为postDate-2017-01-01,此时也会自动更新bitset,[1, 0, 1, 0, 1]

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

参考内容:《Elasticsearch顶尖高手系列-高手进阶篇》

Elasticsearch结构化搜索_filter执行原理深度剖析(bitset机制与caching机制)相关推荐

  1. elasticsearch 结构化搜索_在案例中实战基于range filter来进行范围过滤

    2019独角兽企业重金招聘Python工程师标准>>> 课程大纲 1.为帖子数据增加浏览量的字段 POST /forum/article/_bulk { "update&q ...

  2. elasticsearch 深入 —— 结构化搜索

    结构化搜索 结构化搜索(Structured search) 是指有关探询那些具有内在结构数据的过程.比如日期.时间和数字都是结构化的:它们有精确的格式,我们可以对这些格式进行逻辑操作.比较常见的操作 ...

  3. 【Elasticsearch 权威指南学习笔记】结构化搜索

    结构化搜索(Structured search) 是指有关探询那些具有内在结构数据的过程.比如日期.时间和数字都是结构化的:它们有精确的格式,我们可以对这些格式进行逻辑操作.比较常见的操作包括比较数字 ...

  4. 唯一插件化Replugin源码及原理深度剖析--插件的安装、加载原理

    上一篇 唯一插件化Replugin源码及原理深度剖析–唯一Hook点原理 在Replugin的初始化过程中,我将他们分成了比较重要3个模块,整体框架的初始化.hook系统ClassLoader.插件的 ...

  5. 麦肯锡著名的三大结构化工具:金字塔原理、MECE和逻辑树

    今天给大家重点介绍一下,麦肯锡著名的三大结构化工具:金字塔原理.MECE原理和逻辑树: 关于金字塔原理 对于金字塔原理这种逻辑思考工具,要想掌握,是需要花时间进行反复练习的,包括在培训的现场,是需要进 ...

  6. 【云驻共创】华为云云原生之Kubernetes网络架构原理深度剖析(上)

    文章目录 前言 一.Kubernetes诞生背景 1.云原生的概念 2.云原生架构 3.Kubernetes(k8s) 二.Kubernetes基本网络模型剖析 1.概念厘清 1.1 二层桥接 VS ...

  7. 云原生钻石课程 | 第5课:Kubernetes存储架构原理深度剖析(下)

    点击上方"程序猿技术大咖",关注并选择"设为星标" 回复"加群"获取入群讨论资格! 本篇文章来自<华为云云原生王者之路训练营>钻 ...

  8. SQL Server性能调优之执行计划深度剖析 第二节 执行计划第一次实践

    SQL Server性能调优之执行计划深度剖析 第二节 执行计划第一次实践 前言:自从上一篇文章发出之后,收到了很朋友的关注.很多朋友要求多多实践,而不是纯粹的理论.确实,从打算出这个系列开始,我就本 ...

  9. git原理详解与实操指南_全网最精:学git一套就够了,从入门到原理深度剖析

    以上资源收集至互联网 如有侵权请联系删除 资源获取方式 扫码关注资源库公众号 回复密码'20190812' 即可获得 截图展示 课程信息 课程难度:中级 学习人数:148352 课程状态:已完结 时长 ...

最新文章

  1. 混凝土地坪机器人_创新引领 快速建造丨临时设施大项目部使用机器人等五项技术刷新建设新效率...
  2. 菜单工具栏wxPython菜单与工具栏基础示例
  3. win7-elasticsearch环境搭建
  4. Java字节码指令简介
  5. oracle anonhugepage,案例:Oracle linux redhat检查Transparent HugePages状态并关闭
  6. Acer E1-471G DMI信息修改案例(硬刷)
  7. 定投的收益率怎么计算
  8. 微信跳一跳小游戏源码
  9. 《每日一题》NO.21:画出CMOS 非门/与非门/或非门的结构
  10. [lighttpd]referer字段实现域名过滤及放行指定域名不走重定向
  11. 计算机用户名英文名称,好听的电脑英文用户名
  12. mmo服务器 性能测试,【Zinx应用-MMO游戏案例-(5)构建项目及用户上线】Golang轻量级并发服务器框架...
  13. Shamir门限秘密共享方案 秘密分配及还原过程详解 【橘小白】
  14. 批量无损压缩图片大小的工具Voralent Antelope
  15. win10共享打印机 报错 709 57
  16. 巧用Photoshop为透明玻璃杯抠图
  17. ruoyi框架分页总条数total返回错误解决方案
  18. 【Vue3 | 实现精美待办】01.项目启航
  19. 安卓APP按键美化——圆角按键
  20. 21种情况下千万别喝茶水

热门文章

  1. 如何高效学习web_使用高效的Web工具改善您的业务
  2. 使用Shell和Java驱动程序的MongoDB身份验证配置示例
  3. 生日特惠餐厅 北京_黑色星期五特惠终极指南
  4. C++基础教程之C++数据抽象
  5. C++基础介绍,C++基本简介
  6. 开课吧课堂:超类变量如何引用子类对象?
  7. Java新职篇:一维数组
  8. 链家网前端总架构师杨永林:我的8年架构师成长之路
  9. mysql5.6.35源码安装记录
  10. 社区OpenJDK代码构建平台投入使用