问题描述
我最近从 Elasticsearch 6 升级到 7,偶然发现了 10000 次点击限制。
Changelog、Documentation 和我还发现了一个 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个文档后停止计数。
相关链接: