主要知识点:

  • 一次filter执行顺序
  • filter和query的特点

 
 

一、一次filter执行顺序

 
 

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

以一下date数据来举例

 
 

word                doc1                doc2                doc3

 
 

2017-01-01        *                *

2017-02-02                        *                *

2017-03-03        *                *                *

filter:2017-02-02

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

 
 

、为每个在倒排索引中搜索到的结果,构建一个bitset,

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

上例匹配的bitset是[0,1,1],doc1不匹配这个filter条件,doc2和do3匹配这个filter条件。

用bitset的目的是尽可能用最简单的数据结构去实现复杂的功能,可以节省内存空间,提升性能。

 
 

3、遍历每个过滤条件对应的bitset

在一个search请求中,可以发出多个filter条件,每个filter条件都会对应一个bitset。所以在遍历每个filter条件对应的bitset时,先从最稀疏的开始依次遍历,这样就可以先过滤掉尽可能多的数据。[0, 0, 0, 1, 0, 0]和[0, 1, 0, 1, 0, 1]比较,前者就比较稀疏,因为1较后者少。示例:

请求: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

es会跟踪query,在最近256个query中es会对超过一定次数(该次数不固定)的过滤条件,自动缓存这个filter对应的bitset。对于小segment(数据小于1000条,或该segment的大小小于所在index的大小的3%)不缓存bitset。这样就可以把bitset缓存在内存中,这样下次如果再有同样的条件过来的时候,就不用再一次重新扫描倒排索引,反复生成bitset,可以大幅度提升性能

小segment对应的bitset不缓存的原因:segment数据量很小,扫描很快;segment会在后台自动合并,小segment很快就会跟其他小segment合并成大segment,此时就缓存也没有什么意义,因为segment很快就消失了,而原缓存的bitset还是对应原segment的顺序。

filter比query的好处就在于filter会自动caching,实际bitset上并不是一个filter返回的完整的doc list数据结果。而是把filter bitset缓存起来。下次不用扫描倒排索引了。

 
 

二、filter和query的特点

1、filter和query执行顺序

filter大部分情况下在query之前执行,这样做的目的是先过滤掉尽可能多的数据。

query:是会计算doc对搜索条件的relevance score,还会根据这个score去排序

filter:只是简单过滤出想要的数据,不计算relevance score,也不排序

 
 

2、cached bitset会被自动更新

如果document有新增或修改,或者segment有变化,那么cached bitset会被自动更新

 
 

3、对两次相同的filter条件

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

 
 

 

 
 

 
 

 
 

3.filter原理(bitset机制与caching机制)的更多相关文章

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

    (1)在倒排索引中查找搜索串,获取document list date来举例 word doc1 doc2 doc3 2017-01-01 * *2017-02-02  *   *2017-03-03 ...

  2. 《深入理解mybatis原理》 MyBatis事务管理机制

    MyBatis作为Java语言的数据库框架,对数据库的事务管理是其很重要的一个方面.本文将讲述MyBatis的事务管理的实现机制. 首先介绍MyBatis的事务Transaction的接口设计以及其不 ...

  3. Atitit. servlet 与 IHttpHandler  ashx  listen 和HttpModule的区别与联系 原理理论 架构设计   实现机制    java php c#.net js javascript  c++ python

    Atitit. servlet 与 IHttpHandler  ashx  listen 和HttpModule的区别与联系 原理理论 架构设计   实现机制    java php c#.net j ...

  4. cookie机制和session机制的原理和区别[转]

    一.cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. 同时我们也看到,由于在服务器端保持状态的 ...

  5. Filter 原理

    二.Filter 原理 2.1 Filter 概述 Filter(过滤器)是 DirectShow 中最基本的概念.DirectShow 是通过 Filter Graph 来管理 Filter 的.F ...

  6. Atitit.事件机制 与 消息机制的联系与区别

    Atitit.事件机制 与 消息机制的联系与区别 1. 消息/事件机制是几乎所有开发语言都有的机制,在某些语言称之为消息(Event),有些地方称之为(Message).1 2. 发布/订阅模式1 3 ...

  7. ActiveMQ讯息传送机制以及ACK机制

    http://blog.csdn.net/lulongzhou_llz/article/details/42270113 ActiveMQ消息传送机制以及ACK机制详解 AcitveMQ是作为一种消息 ...

  8. Linux内存寻址之分段机制及分页机制【转】

    前言 本文涉及的硬件平台是X86,如果是其他平台的话,如ARM,是会使用到MMU,但是没有使用到分段机制: 最近在学习Linux内核,读到<深入理解Linux内核>的内存寻址一章.原本以为 ...

  9. nginx AIO机制与sendfile机制

    nginx AIO机制与sendfile机制 从0.8.11版本开始, nginx 开始支持Linux native aio,如何在nginx里配置使用这套机制是本文介绍的重点.在下面的示例配置中,几 ...

随机推荐

  1. Java课程设计——人事管理系统

    主界面代码: package PersonSystem; import java.awt.*; import java.awt.event.*; import javax.swing.*; impor ...

  2. 数据挖掘算法学习(八)Adaboost算法

    本文不定期更新.原创文章,转载请附上链接http://blog.csdn.net/iemyxie/article/details/40423907 谢谢 Adaboost是一种迭代算法,其核心思想是针 ...

  3. WAMP 2.5 &quot;FORBIDDEN&quot; error

    对于web开发人员来说.远程訪问站点能够非常方便的提高开发站点开发效率,那么在wamp环境下,默认仅仅支持本地訪问,那么怎样訪问开启远程站点訪问呢? 开启方法: wamp2.5(32bit) 集成环境 ...

  4. android TabHost控件

    (一)TabHost控件,默认是在顶部显示的 TabHost是盛放Tab按钮和Tab内容的首要容器, TabWidget(tabs标签)用于选择页面,是指一组包含文本或图标的 ,FrameLayout ...

  5. P3202 [HNOI2009]通往城堡之路 神仙题

    这个题不是坑人吗...写个tarjan标签,然后拿这么个神仙题来搞...代码有点看不懂,有兴趣的可以去洛谷题解区看看,懒得想了. 题干: 题目描述 听说公主被关押在城堡里,彭大侠下定决心:不管一路上有 ...

  6. Django-CKeditor使用笔记

    1. 安装django-ckeditor $ pip install django-ckeditor 2. 在setting中,添加ckeditor , ckeditor_uploader 到INST ...

  7. JavaScript--确认(confirm 消息对话框)

    confirm 消息对话框通常用于允许用户做选择的动作,如:“你对吗?”等.弹出对话框(包括一个确定按钮和一个取消按钮). 语法: confirm(str); 参数说明: str:在消息对话框中要显示 ...

  8. 51nod1446 Kirchhoff矩阵+Gauss消元+容斥+折半DFS

    思路: //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using ...

  9. iOS动画——CoreAnimation

    CoreAnimation在我之前的UIKit动画里面简单的提了一句CoreAnimation动画,其实大家别看它类库名种有个animation,实际上animation在这个库中只占有很小的地位. ...

  10. JS——offset

    1.offsetWidth.offsetHeight返回盒子宽度和高度,包括padding与border,不包括margin 2.offsetLeft.offsetTop返回盒子距离定位盒子的x轴方向 ...