首页 > 解决方案 > 在 Elasticsearch 中通过 _id 查询路由获取以提高性能?

问题描述

我有一个包含数亿个文档的 Elasticsearch 索引,主要用于“通过 id 获取”查询。

我考虑在索引时添加到文档的路由。路线将是一个从 0 到 9 的随机数。

稍后,此路由将位于带有文档 ID 的 URL 中,它将用于获取文档。目前我在URL中只有文档 ID,但也计划添加路由。新 URL 将如下所示https://tarta.ai/ j/ [route] /[doc id]。

我想知道它会减少在索引中查找文档所需的时间吗?我的建议是,在这种情况下,Elasticsearch 不会在所有分片中查找文档,而是仅在具有此特定路径的分片中查找。


一些弹性搜索规范:

标签: performanceelasticsearchelasticsearch-dsl

解决方案


路由在搜索(即POST index/_search)时特别有用,因为 ES 不会搜索索引的所有分片,而是只搜索路由值解析到的单个分片。

如果您routing在索引文档时指定一个值,则在获取该文档时必须指定相同的路由值,没有其他选择。

# index with routing
PUT index/_doc/1?routing=123

# returns the document
GET index/_doc/1?routing=123

# returns nothing
GET index/_doc/1

如果在索引文档时没有指定任何路由值,ES 将使用 ID 作为路由值并将文档存储在该路由值解析到的分片上。所以当获取这样一个没有任何路由值的文档时,ES 会知道使用 ID 作为路由值,这就是为什么你不必指定它(尽管你可以)。

# index without routing
PUT index/_doc/1

# returns the document
GET index/_doc/1

# returns the document as well
GET index/_doc/1?routing=1

这意味着对于 GET 操作,路由或不路由没有区别,主要是搜索,路由具有附加值。

使用路由时,您需要确保的另一件事是您的 ID 应该是“均衡的”,以便它们的哈希可以解析为具有相似概率的任何分片。如果不是这种情况,您将面临在索引中创建热点的风险,即某些分片可能比其他分片大。


推荐阅读