上下文:

  • 我们的应用程序确实具有accountId和subaccountIds
  • 我们确实设置routingId = accountId,以便使帐户的所有数据都驻留在分片
  • 在某些情况下,需要更改accountId。

  • 问题:
    有什么方法可以更新ES中现有文档的routingId?
    我确实知道我们可以保留旧的routingId以获取数据。但是还有其他方法吗?

    最佳答案

    如果您在通过查询进行更新的过程中尝试修改_routing值,则会出现以下错误:

    {
      "error" : {
        "root_cause" : [
          {
            "type" : "illegal_argument_exception",
            "reason" : "Modifying [_routing] not allowed"
          }
        ],
        "type" : "illegal_argument_exception",
        "reason" : "Modifying [_routing] not allowed"
      },
      "status" : 400
    }
    
    修改给定文档的路由具有将文档潜在地移动到新分片的效果,这是不允许的。同样,您将得到两个文档,它们在相同的索引中具有相同的ID,仅位于两个不同的分片上。
    在保持索引一致的同时,实现所需内容的唯一方法是:
  • 首先删除具有旧路由值
  • 的文档
  • ,然后使用新的路由值对其重新编制索引。
  • 10-08 00:49