3.filter原理(bitset机制与caching机制)
主要知识点:
- 一次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机制)的更多相关文章
- elasticsearch中filter执行原理深度剖析(bitset机制与caching机制)
(1)在倒排索引中查找搜索串,获取document list date来举例 word doc1 doc2 doc3 2017-01-01 * *2017-02-02 * *2017-03-03 ...
- 《深入理解mybatis原理》 MyBatis事务管理机制
MyBatis作为Java语言的数据库框架,对数据库的事务管理是其很重要的一个方面.本文将讲述MyBatis的事务管理的实现机制. 首先介绍MyBatis的事务Transaction的接口设计以及其不 ...
- 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 ...
- cookie机制和session机制的原理和区别[转]
一.cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. 同时我们也看到,由于在服务器端保持状态的 ...
- Filter 原理
二.Filter 原理 2.1 Filter 概述 Filter(过滤器)是 DirectShow 中最基本的概念.DirectShow 是通过 Filter Graph 来管理 Filter 的.F ...
- Atitit.事件机制 与 消息机制的联系与区别
Atitit.事件机制 与 消息机制的联系与区别 1. 消息/事件机制是几乎所有开发语言都有的机制,在某些语言称之为消息(Event),有些地方称之为(Message).1 2. 发布/订阅模式1 3 ...
- ActiveMQ讯息传送机制以及ACK机制
http://blog.csdn.net/lulongzhou_llz/article/details/42270113 ActiveMQ消息传送机制以及ACK机制详解 AcitveMQ是作为一种消息 ...
- Linux内存寻址之分段机制及分页机制【转】
前言 本文涉及的硬件平台是X86,如果是其他平台的话,如ARM,是会使用到MMU,但是没有使用到分段机制: 最近在学习Linux内核,读到<深入理解Linux内核>的内存寻址一章.原本以为 ...
- nginx AIO机制与sendfile机制
nginx AIO机制与sendfile机制 从0.8.11版本开始, nginx 开始支持Linux native aio,如何在nginx里配置使用这套机制是本文介绍的重点.在下面的示例配置中,几 ...
随机推荐
- USACO zerosum DFS 1A
USER: Kevin Samuel [kevin_s1] TASK: zerosum LANG: C++ Compiling... Compile: OK Executing... Test 1: ...
- leaning website
-->SoapUI http://soapui-tutorial.com/home/login/SOAPUI Module 13 - 1, 2, 3, 4, 5, 6 Module 1 ...
- poj3421 X-factor Chains——分解质因数
题目:http://poj.org/problem?id=3421 好久没有独立A题了...做点水题还是有助于提升自信心的: 这题就是把 x 质因数分解,质因数指数的和 sum 就是最长的长度,因为每 ...
- 68. 对Extjs中store的多种操作
转自:https://www.cnblogs.com/exmyth/archive/2013/05/16/3082045.html 先来个声明,看着不错,贴过来的,没都测试过. Store.getCo ...
- IBatis异常: Cannot find class: VARCHAR
今天再项目里添加新功能时,突然爆出 org.springframework.beans.factory.BeanCreationException: Error creating bean with ...
- PCB MS SQL SERVER 字段含小写字母更新为大写字母
今天在预审完成时报如下错误,此错误原因是由于SQL Server数据字段存在小写,而Oracle数据库需大写导致的, 怎么解决这个问题了,非常简单 .这里将SQL贴出来 . 1.将生产型号中含有小写字 ...
- Ballot evaluation
http://acm.hdu.edu.cn/showproblem.php?pid=2986 题意很简单,主要是要处理精度,最手残的是把单词拼写错了... #include <stdio.h&g ...
- 互斥的数(hash)
1553 互斥的数 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有这样的一个集合,集合中的元素个数由给定的N决定, ...
- python自动化测试学习笔记-2-字典、元组、字符串方法
一.字典 Python字典是另一种可变容器模型,且可存储任意类型对象,如字符串.数字.元组等其他容器模型. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割, ...
- 通过UDP建立TCP连接
解释 通过UDP广播查询服务器的IP地址,然后再建立TCP点对点连接. 应用场景 在服务器IP未知时,并且已知服务器与客户端明确在一个局域网或者允许组播的子网下. 通过UDP发现服务器地址然后再进行T ...