例如,我有两个分片A和B,如果我想从20中获得结果,并且大小为10,那么elasticsearch将首先获得30(20+10)来自碎片A的结果,得到30从分片B中得到(20+10)个结果,然后从60中得到最终的10个结果(30+30),我不能理解为在我看来,你可以从每个分片中获得前10个结果,然后从20个分片中获得最后10个结果(10+10),这意味着你可以从每个分片中获得大小结果,而不是从+size中,因为最终结果必须在每个分片的顶部大小结果中,为什么es这样做?
例如,我有两个分片A和B,如果我想从20中获得结果,并且大小为10,那么elasticsearch将首先获得30(20+10)来自碎片A的结果,得到30从分片B中得到(20+10)个结果,然后从60中得到最终的10个结果(30+30),我不能理解为在我看来,你可以从每个分片中获得前10个结果,然后从20个分片中获得最后10个结果(10+10),这意味着你可以从每个分片中获得大小结果,而不是从+size中,因为最终结果必须在每个分片的顶部大小结果中,为什么es这样做?
1条答案
按热度按时间5cg8jx4n1#
在您的场景中,当您请求从20开始的结果,大小为10时,Elasticsearch不会从每个分片中获取20个结果,然后合并它们。相反,它从每个分片中检索30个结果(范围从20到50),然后将这些结果组合并排序,以提供总池60中的前10个。
采取这种方法是为了确保结果的准确性。如果每个分片独立地产生其前10个结果,那么稍后合并它们可能会导致丢失全局相关的结果。通过从每个分片中获取更大的集合,然后进行排序和合并,Elasticsearch可以准确地优先考虑并全局交付前N个结果,而不仅仅是每个分片中独立的前N个结果。
这种方法可以保持搜索结果的一致性和精确性,特别是在分片之间的数据分布不均匀或者查询涉及复杂的排序和过滤的情况下。虽然这看起来似乎违反直觉,但这种方法对于在像Elasticsearch这样的分布式系统中维护搜索结果的质量至关重要。