ES查询大致可为2步
1 ES Query ---> (各分片上的)Lucene Query
2 得到doc号,取数据,合并返回
ES查询本身很多步骤(比如为了聚合而加入的收集器等等),
跳过这些,直接到Lucene这一层:
而Lucene上的查询大致分片下面几步:
Lucene Query ---> weight ---> 打分器(doc号迭代器) ---> doc号 ---> 叶收集器收集 ---> 返回
(这里的weight,不知道如何翻译,我也不理解他为什么起这个名称)
开始我没明白,查询一定要和打分器联系在一起吗?如果我不需要分数呢?
是在一起的,分数由它提供,文档号也由它提供。
如果不打分,可以认为它提供了0分。
而各个查询实现也是五花八门,有简单有复杂。
稍微复杂一点的比如,terms查询(不是term查询)
这个里面要找的词少,它会重写成bool,
如果词多,它是如何处理的?
要真正明白这个问题,只有自己去看代码了。
更复杂的比如bool查询,其复杂度已经超出了我能理解的范围。
https://www.amazingkoala.com.c ... .html
这里也只是一些零散的bool打分器的分支实现,并没有一个全局的系统性的概述。
1 ES Query ---> (各分片上的)Lucene Query
2 得到doc号,取数据,合并返回
ES查询本身很多步骤(比如为了聚合而加入的收集器等等),
跳过这些,直接到Lucene这一层:
而Lucene上的查询大致分片下面几步:
Lucene Query ---> weight ---> 打分器(doc号迭代器) ---> doc号 ---> 叶收集器收集 ---> 返回
(这里的weight,不知道如何翻译,我也不理解他为什么起这个名称)
开始我没明白,查询一定要和打分器联系在一起吗?如果我不需要分数呢?
是在一起的,分数由它提供,文档号也由它提供。
如果不打分,可以认为它提供了0分。
而各个查询实现也是五花八门,有简单有复杂。
稍微复杂一点的比如,terms查询(不是term查询)
这个里面要找的词少,它会重写成bool,
如果词多,它是如何处理的?
要真正明白这个问题,只有自己去看代码了。
更复杂的比如bool查询,其复杂度已经超出了我能理解的范围。
https://www.amazingkoala.com.c ... .html
这里也只是一些零散的bool打分器的分支实现,并没有一个全局的系统性的概述。
1 个回复
Charele - Cisco4321
赞同来自:
这是ES里面最常见的termQuery的打分器实现,
是很多查询的基础,都和它有关
(并不是所有查询都和它关联,比如点查询,就和它完全无关)
如果刚开始看到,会一头雾水。去掉黄色的,是用来打分的外,
其他4个,究竟doc号由谁来提供?
我以为是那个红色的,因为它是DocIdSetIterator(就是doc号迭代器的意思)类型的,
后来发现其它3个,他们也都是DocIdSetIterator的子类,
这下糊涂了。