摘要:对于小或,不缓存。这样下次如果在有这个条件过来的时候,就不用重新扫描倒排索引,反复生成,可以大幅度提升性能。比好的原因除了不计算相关度分数以外还有这个。
下面详细讲一下为什么filter的性能很高,filter的底层原理究竟是什么?
通过一个搜索的场景来深入剖析一下,当一个filter搜索请求打到Elasticsearch的时候,ES会进行下面的操作:
(1)在倒排索引中查找搜索串,获取document list以date来举例:
word doc1 doc2 doc3 2019-01-01 * * 2019-02-02 * * 2019-03-03 * * *
filter: 2019-02-02
到倒排索引中一找,发现2019-02-02对应的document list是doc2,doc3
这一步是非常重要的,使用找到的doc list,构建一个bitset,就是一个二进制的数组,数组的每个元素都是0或1,用来标识一个doc对一个filter条件是否匹配,如果匹配的话值就是1,不匹配值就是0。
所以上面的filter的bitset的结果就是:
[0,1,1]
doc1:不匹配这个filter的
doc2和doc3:匹配这个filter的
注意:这样做的好处就是尽可能用简单的数据结构去实现复杂的功能,可以节省内存空间,提升性能。
由于一次性可以在一个search请求中发出多个filter条件,那么就会产生多个bitset,遍历每个filter条件对应的bitset优先从最稀疏的开始遍历
[0,0,0,0,0,0,0,1] 比较稀疏的bitset [1,0,1,1,0,1,0,1]
这里主要是因为先遍历比较稀疏的bitset,就可以先过滤掉尽可能多的数据
(4)caching bitsetcaching bitset会跟踪query,在最近256个query中超过一定次数的过滤条件,缓存其bitset。对于小segment(<1000 或<3%),不缓存bitset。这样下次如果在有这个条件过来的时候,就不用重新扫描倒排索引,反复生成bitset,可以大幅度提升性能。
说明:
1、在最近的256个filter中,有某个filter超过了一定次数,这个次数不固定,那么elasticsearch就会缓存这个filter对应的bitset
2、filter针对小的segment获取到的结果,是可以不缓存的,segment记录数小于1000,或者segment大小小于index总大小的3%。因为此时segment数据量很小,哪怕是扫描也是很快的;segment会在后台自动合并,小segment很快会跟其它小segment合并成大segment,此时缓存就没有什么意思了,segment很快会消失。
query: 会计算每个doc的相关度分数,还会根据这个相关度分数去做排序
filter: 只是简单过滤出想要的数据,不计算相关度分数,也不排序
这个过程是ES内部做的,比如之前的bitset是[0,0,0,1]。那么现在插入一条数据或是更新了一条数据doc5,而且doc5也在缓存的bitset[0,0,0,1]的filter查询条件中,那么ES会自动更新这个bitset,变为[0,0,0,1,1]
(7)以后只要有相同的filter条件的查询请求打过来,就会直接使用这个过滤条件对应的bitset这样查询性能就会很高,一些热的filter查询,就会被cache住。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/34478.html
摘要:在上一讲我们可以发现,对于的搜索方式,实现起来可以有多种方式。 在上一讲我们可以发现,对于multi-value的搜索方式,实现起来可以有多种方式。这里就说明一下,实现的方式虽然很多,但是elasticsearch在查询的时候底层都会转换为bool + term的形式 1、普通的match如何转换为term+should { match: { title: ja...
摘要:格式类似于中的大于等于小于等于之类的范围筛选准备数据为帖子数据增加浏览量的字段搜索浏览量在之间的帖子搜索发帖日期在最近个月的帖子准备一条数据,之前时间比较老了 格式: range: { FIELD: { gte: 10, lte: 20 } 类似于SQL中的between、大于等于、小于等于之类的范围筛选 准备数据: PO...
摘要:准备数据需求搜索发帖日期为,或者帖子为的帖子,同时要求帖子的发帖日期不能为输出标识必须匹配可以匹配其中一个即可必须不匹配搜索帖子为,或者是帖子为而且发帖日期为的帖子输出 准备数据: POST /forum/_bulk { index: { _id: 1 }} { articleID : XHDK-A-1293-#fJ3, userID : 1, hidden: false, postD...
摘要:格式描述格式格式对于,如果和语句联系起来的话,那么就相当于准备数据为帖子字段增加字段搜索为或的帖子输出搜索中包含的帖子优化搜索结果,仅仅搜索中只包含的帖子更新数据增加字段包含的标签数量 格式描述: term格式: term: { FIELD: { value: VALUE } terms格式: terms: { ...
阅读 1793·2021-11-23 09:51
阅读 904·2021-11-22 13:52
阅读 3476·2021-11-10 11:35
阅读 924·2021-10-25 09:47
阅读 1847·2021-09-28 09:35
阅读 2731·2021-09-07 09:58
阅读 890·2019-08-30 15:54
阅读 2693·2019-08-29 14:21