Elasticsearch 7 track_total_hits 如何提高查询速度?

问题描述

我最近从 Elasticsearch 6 升级到 7,偶然发现了 10000 次点击限制。

ChangelogDocumentation 和我还发现了一个 blog post from a company 尝试了这个新功能并测量了它们的性能提升。

但我仍然不确定此功能如何以及为何起作用。还是只有在特殊情况下才能提高性能?

特别是在涉及排序时,我无法理解它。因为(至少在我的世界中)在对集合进行排序时,您必须访问每个文档,而这正是他们试图根据 Documentation: " 通常总命中数不能是无需访问所有匹配项即可准确计算,这对于匹配大量文档的查询来说成本很高。”

希望有人能解释一下事情是如何运作的,以及我遗漏了哪一点。

解决方法

至少有两种不同的上下文需要对所有文档进行排序:

A.配置 index sorting 后,文档已按排序顺序存储在索引段文件中。因此,每当查询指定与索引预先排序的排序相同的排序时,则只需要访问和返回每个段文件的前 N ​​个文档。所以在这种情况下,如果你只对前 N 个结果感兴趣,而不关心总命中数,你可以简单地将 <button id="myButton" onClick='myFunction()'>Turn on</button> 设置为 false。这是一个很大的优化,因为不需要访问索引的所有文档。

B.在filter context(即track_total_hits)中查询时,因为不会计算分数。索引只是检查与是/否问题匹配的文档,并且该过程通常非常快。由于没有评分,每个分片只返回前N个匹配文档。

如果 bool/filter 设置为 false(因为您不关心匹配文档的确切数量),则根本不需要计算文档,因此不需要访问所有文档。>

如果track_total_hits设置为N(因为你只关心是否至少有N个匹配的文档),那么每个分片有N个文档后停止计数。

相关链接:

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...