elasticsearch:如果存在于索引的所有分片中,则更新doc

时间:2015-11-05 09:21:05

标签: elasticsearch lucene search-engine

我搜索了如果存在,则在索引的所有分片中更新ES中的文档。我找到了一种方法(/ _bulk api),但它需要我们指定路由值。我无法找到问题的解决方案。如果有人知道以下的事情请更新我。

  1. 如果使用单个更新查询存在,是否有任何方法可以更新索引的所有分片中的文档?

  2. 如果没有,有没有办法生成路由值,以便我们能够使用更新查询命中所有分片?

1 个答案:

答案 0 :(得分:0)

理想情况下,对于批量更新,ES建议通过查询获取需要使用扫描和滚动进行更新的文档,更新文档并再次索引它们。在内部,ES从不更新文档,尽管它通过脚本提供Update API。它始终使用更新的字段/值重新索引新文档,并删除旧文档。

Is there any way to update the doc in all the shards of an index if exists using a single update query?.

您可以查看update API是否符合您的目的。还有插件可以通过查询提供更新。 Check this.

现在出现了路由部分并更新了所有分片。如果您在第一次索引文档时指定了路由值,则无论何时更新文档,都需要设置原始路由值。否则ES永远不会知道文档所在的碎片是什么,它可以将它发送到任何碎片(基于算法)。

如果您不使用路由值,那么根据文档的ID,ES使用算法来决定它需要去的分片。因此,当您通过批量API更新文档并在没有路由的情况下保留相同的ID时,文档将保存在与之前相同的分片中,您将看到更新。