【问题标题】:Route get by _id queries in Elasticsearch to improve performance?在 Elasticsearch 中通过 _id 查询路由获取以提高性能?
【发布时间】:2021-09-08 18:44:18
【问题描述】:

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

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

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

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


一些弹性搜索规范:

  • 索引大小为 110gb。
  • 文档数量为 3600 万,但我们每天都在增加数十万。
  • 5 个分片。
  • 16GB RAM 和 2 核虚拟机和 1 吨 SSD。

【问题讨论】:

    标签: performance elasticsearch elasticsearch-dsl


    【解决方案1】:

    路由在搜索时特别有用(即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 应该是“均衡的”,以便它们的哈希可以解析为具有相似概率的任何分片。如果不是这种情况,您将面临在索引中创建热点的风险,即某些分片可能比其他分片更大。

    【讨论】:

    • 这个运气好吗?
    猜你喜欢
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多