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

How does Elasticsearch 7 track_total_hits improve query speed?

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

Changelog, Documentation, and I also found a single blog post from a company 尝试了这个新功能并测量了他们的性能提升。

但我仍然不确定此功能的工作原理和原因。还是只在特殊情况下提高性能?

尤其是涉及到排序的时候,我就摸不着头脑。因为(至少在我的世界中)在对集合进行排序时,您必须访问每个文档,而这正是他们根据 Documentation 试图避免的:“通常总命中数可以”在不访问所有匹配项的情况下无法准确计算,这对于匹配大量文档的查询来说代价高昂。"

希望有人能解释幕后工作原理以及我遗漏的要点。

至少有两种不同的上下文并非所有文档都需要排序:

一个。配置 index sorting 时,文档已按排序顺序存储在索引段文件中。因此,只要查询指定与索引预排序的排序相同的排序,则只需要访问并返回每个段文件的前 N ​​个文档。所以在这种情况下,如果你只对前N个结果感兴趣,而不关心总的命中数,你可以简单地将track_total_hits设置为false。这是一个很大的优化,因为不需要访问索引的所有文档。

乙。在filter context查询时(即bool/filter)因为不会计算分数。只需检查索引以查找与 yes/no 问题匹配的文档,该过程通常非常快。由于没有评分,每个分片仅返回前 N 个匹配文档。

如果track_total_hits设置为false(因为你不关心匹配文档的确切数量),那么根本不需要统计文档,因此不需要访问所有文档。

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

相关链接: