es filter过滤的bitset机制和caching机制

document存储数据为:

PUT /forum/article/_bulk
{ "index": { "_id": 1 }}
{ "articleID" : "XHDK-A-1293-#fJ3", "userID" : 1, "hidden": false, "postDate": "2017-01-01" }
{ "index": { "_id": 2 }}
{ "articleID" : "KDKE-B-9947-#kL5", "userID" : 1, "hidden": false, "postDate": "2017-01-02" }
{ "index": { "_id": 3 }}
{ "articleID" : "JODL-X-1937-#pV7", "userID" : 2, "hidden": false, "postDate": "2017-01-01" }
{ "index": { "_id": 4 }}
{ "articleID" : "QQPX-R-3956-#aD8", "userID" : 2, "hidden": true, "postDate": "2017-01-02" }

查询语句(获取userid==1 && postDate==2017-01-01的document 并且articleID包含XHDK):

GET /forum/article/_search{  "query": {     "bool": {       "filter": [         { "term":  { "hidden": "false"}},         { "term": { "postDate": "2017-01-01" }} ,        { "match": { "articleID":   "XHDK"}}      ]    }  }}

此语句查询过程,涉及到caching和bitset部分。

bitset机制

(1) 在倒排索引中查找字符串,获取documnet list。

(2)位每个在倒排索引中搜索到的结果,构建一个bitset。0代表不匹配,1代表匹配,使用bitset这种数据结构可以节省内存空间,提升性能。

"term":  { "hidden": "false"}------>[1,1,1,0]
"term": { "postDate": "2017-01-01" }----> [1,0,1,0]
"match": { "articleID":   "XHDK"}------> [1,0,0,0]

(3)遍历每个过滤条件对应的bitset,优先从最稀疏的开始搜索,查找所有满足所有条件的document

最稀疏的应该是"match": { "articleID":   "XHDK"}------> [1,0,0,0]。这样可以尽可能多的过滤掉documnet。再过滤"term": { "postDate": "2017-01-01" }----> [1,0,1,0]。遍历完后bitset之后,找到所有匹配的document。[1,0,0,0],也就是document==1一个。

caching机制

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

使用缓存,可以不用重新扫描倒排索引,不用反复生成bitset,可以大幅度提升性能。

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

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

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

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

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

参考文档:https://www.jianshu.com/p/83e4771f697e

原文地址:https://www.cnblogs.com/parent-absent-son/p/11064819.html

时间: 2024-07-31 00:38:58

es filter过滤的bitset机制和caching机制的相关文章

3.filter原理(bitset机制与caching机制)

主要知识点: 一次filter执行顺序 filter和query的特点 一.一次filter执行顺序 1.在倒排索引中查找搜索串,获取document list 以一下date数据来举例 word                doc1                doc2                doc3 2017-01-01        *                * 2017-02-02                        *                * 2

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

(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 (2)为每个在倒排索引中搜索到的结果,构建一个bitset,[0, 0, 0, 1, 0, 1] 非常重要 使用找到的doc list,构建一个bit

验证多个Filter过滤一个资源时执行顺序

当有多个Filter过滤一个资源时,执行顺序到底是怎样? 如下测试: 定义两个Filter,FirstFilter,SecondFilter,它们过滤同一个index.jsp页面,并且SecondFilter的映射写在FirstFilter后面 并在两个Filter的doFilter()方法中加上输出语句: 例如FirstFilter的doFilter方法: @Override public void doFilter(ServletRequest request, ServletRespons

easyui filter 过滤时间段

1 $.extend($.fn.datagrid.defaults.filters, {  2     dateRange: {  3         init: function(container, options){  4             var c = $('<div style="display:inline-block"><input class="d1"><input class="d2">

filter过滤敏感文字

1.提交页面 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&

angular&#160;如何获取使用filter过滤后的ng-repeat的数据长度

在做项目的过程中,被产品要求在内容为空的过程中显示提示信息,然哦户内容使用ng-repeat循环输出的,并且使用了filter过滤.后在谷歌上找到解决方案,如下: ?之前代码如下显示: <ul> <li ng-repeat="tagChoose in evaluateObj.tagChooseList|filter:{type:1}"> <label> <input type="checkbox" name="de

Java Filter过滤xss注入非法参数的方法

http://blog.csdn.NET/feng_an_qi/article/details/45666813 Java Filter过滤xss注入非法参数的方法 web.xml: [html] view plain copy <filter> <filter-name>XSSFiler</filter-name> <filter-class> com.paic.mall.web.filter.XssSecurityFilter </filter-c

Android利用Filter过滤数据

MainActivity如下: package cc.testfilterable; import java.util.ArrayList; import java.util.HashMap; import android.os.Bundle; import android.widget.ListView; import android.app.Activity; import android.content.Context; /** * Demo描述: * 利用Filter过滤数据 * 可用于

ASP.NET MVC 5使用Filter过滤Action参数防止sql注入,让你代码安全简洁

在开发程序的过程中,稍微不注意就会隐含有sql注入的危险.今天我就来说下,ASP.NET mvc 5使用Filter过滤Action参数防止sql注入,让你代码安全简洁.不用每下地方对参数的值都进行检查,看是用户输入的内容是否有危险的sql.如果每个地方都要加有几个缺点: 1.工作量大 2.容易遗漏 3.不容易维护 下面我通过写一个过滤防止sql的特性类,对Action执行前对Action的参数进行处理,如果有其值有sql语句,就会这些非法字符替换为空字符串. 一.sql注入的例子: 上面的输入