你不会是程序猿吧?

ES查询时对Lucene的优化

Elasticsearch | 作者 Charele | 发布于2022年08月15日 | 阅读数:1588

优化啥呢,ES底层用的是Lucene(简称L),最后一定是执行的L代码。
如果你看过ES里search的实现,最后你就会看到这个,
 
111.png

 
 在构造了query对像和这个有点复杂的收集器对像后,就交给L去运行了。
(因为这个search()是L里的方法)
 
好像ES只要静静地等L完成就行了。后来发现不是,ES还做了一点小改动。
就好比执行的是L的aaa()方法,aaa()里面去执行bbb()方法,
而ES又重写了bbb()方法,所以在这里改动了。
 
改的目的有两个
1 实现cancellable,就是为了能中止查询
2 就是标题中的优化
 
已邀请:

Charele - Cisco4321

赞同来自: xxwen1217

cancellable不是主题,说的是第二点,它是如何优化的
222.png

 
这个getSparseBitSetOrNull()方法,就是看下live名单,它是不是稀疏类型的,
(如果非稀疏类型就返回null,但并不代表live本身是null)
 
如果null,就没啥特别的,跟Lucene里执行是一样的。
 
如果不是null,说明是稀疏的,就执行优化
稀疏就是说,活下来的很少。比如有一万个文档,你删除了9995个,只剩5个了
 
注意两个红色的不同,都是打分器,一个是BulkScorer,一个是Scorer,
这两个是查询里重要的概念。
(他们名字差不多,初学者可能难理清他们的关系)

Charele - Cisco4321

赞同来自: xxwen1217

333.png

红色处,它把live和文档号列表取交集,然后再送给叶收集器。
因为live是稀疏的,所以就预先过滤了大部分的无效文档号,提高了效率。
 
什么情况会产生稀疏呢,下面来看下。

要回复问题请先登录注册