如何在不影响性能、可扩展性和避免 Elasticsearch 的分片效应的情况下获得更好的相关性

How to get better relevance without compromising on performance, scalability and avoid the sharding effect of Elasticsearch

假设我有一个大索引,包含 5 亿个文档,默认情况下,ES 出于以下原因创建 5 个主分片,我也使用相同的设置。

  1. 性能:- 在文档数量较少的分片(我的用例中为 1 亿)中搜索的时间会比在 1包含大量文档(5 亿)的分片。此外,允许跨分片分布和并行化操作。

  2. 水平可扩展性 (HS) :- 水平 split/scale 您的内容量。

但是当我们默认搜索时,它只会转到 1 个分片并给出结果。在这种情况下,相关性不准确(因为 idf 受到重大影响),如果我的匹配文档在另一个分片上,它甚至可能不会给出任何结果。它被称为分片效应

以上问题已详细解释 here 并且有以下 2 个选项可以避免此问题,但我认为这两种解决方案都有一些缺点:-

1.文档路由: 在这种情况下,所有文档都将位于同一个分片上,这将失去分片的全部目的。
2。 dfs_query_then_fetch 搜索类型: 有与之相关的性能成本。

我有兴趣了解以下内容:

  1. ES 默认做什么?或者是否有任何可以控制它的配置?
  2. ES 是否提供了其他开箱即用的解决方案来避免 分片效应

首先,如果您的问题的这一部分不准确:

But when we search by default it just goes to 1 shard and gives the result. in this case, relevance isn't accurate(as idf be majorly impacted) and also it might even not give any result if my matched document is on another shard. and its called as The Sharding Effect.

粗体部分为假。搜索请求被发送到所有分片(当然,否则没有人会使用 elasticsearch!)但是分数是在分片的基础上计算的。所以是的,你可能会遇到多个分片的准确性问题,但前提是你的文档很少。有了 5 亿,准确性就不是问题(除非你对文档路由使用不当,请参阅 here for more informations

因此,当您为一个查询搜索 10 个结果时,每个分片 return 查询的 10 个最佳匹配,然后来自分片的结果由协调节点聚合以给出最佳的 10 个结果整个指数。

您可以使用 5 个分片而不用担心任何相关性问题。但不要试图避免分片效应!这就是让 elasticsearch 如此酷的原因 :D