如何让Elasticsearch坐标节点不合并和求助

时间:2019-11-28 03:18:05

标签: elasticsearch

例如,ES集群有3个分片,一个查询要获取300个文档。

通常,坐标节点将从每个分片中获得300个文档,总共3 * 300 = 900个文档,然后对这900个文档进行排序,并返回前300个文档。

如何设置查询,让坐标节点从每个分片中获取100个文档,并返回3 * 100 = 300个文档?

1 个答案:

答案 0 :(得分:0)

很好奇为什么您希望每个分片只返回结果匹配的相同大小的份额/切片,因为300个最相关/重要的匹配不太可能均匀地分布在所有分片中。

协调节点的任务不仅是返回300个匹配,还包括300个最相关/最重要的匹配。默认情况下,命中按得分递减排序(除非您指定其他排序标准)。静态地考虑每个分片的100次点击可能会导致总的结果列表毫无意义。

一个例子:为简单起见,假设您的索引仅由2个(主要)分片组成,并且包含早在2007年初的有关手机新闻的文档。很可能您的索引中包含许多有关Windows的文档,诺基亚和黑莓手机。然后,突然之间iPhone宣布发布,文章开始出现。让我们进一步假设,在电话展示之后,已经有100篇有关iPhone的非常相关的文章已经发布并在您的Elasticsearch索引中进行了索引,现在您正在查询有关iPhone的100项热门文章。通过使协调节点“优化”您所要求的方式,将从两个分片中检索前50个文档。因此,很可能最终结果集中只有60-70个相关文章,而其他30-40个非常相关的匹配数据却丢失了(更糟糕的是,有30-40个文章相当无关紧要而已,因为他们曾经提到过“ iPhone”一词。

实际上,协调节点也是“智能”的,在保证它们不包含任何匹配文档的情况下,在某些情况下可以跳过分片。

此外,如果您不处理大数据并且所有文档都可以轻松地固定到一个文件中,则将索引配置为由1个分片组成,并且协调节点不需要进行任何合并。

如果用例完全不依赖于相关性,则可以考虑将数据组织在不同的索引中(而不是索引中的多个分片)。然后,您可以独立查询每个索引的前n个匹配项,并在应用程序端合并结果。但这会涉及更多的网络往返,因此最终可能会更慢。