Elasticsearch reindex API部分更新

问题描述:

因此,我们需要将Elasticsearch文档从一个索引重新索引到另一个索引。我们正在使用reindex API。尽管有时文档已经存在于目标索引中。设置version_type: "external"可以使目标索引中的文档更新,这非常有效,除非它执行完整更新,我希望它在该文档上执行部分更新。 像设置ctx.op = "partial"就好,但它显然没有实施到今天。 任何可以实现这一点的替代想法将不胜感激。Elasticsearch reindex API部分更新

PS:我想避免查询每个文档的源索引,并用upsert单独发送到目的地,由于性能原因,与reindex API相比,它似乎很慢。

免责声明:此答案已更新。

要实现部分更新,您可以定义script)。

从理论上讲,您可以将所需的任何转换应用于要重新编制索引的文档。

(原来的答案结束)


实现自定义重新索引与合并

正如指出的问题的作者,如果需要合并两个没有帮助文件,已经存在于结果索引中的文件和新文件。

Elasticsearch _reindex方法被引入version 2.3并被认为是实验;它看起来好像只是一个scroll查询与bulk insert API的组合。我做出这个结论基于这样this page权威指南中的建议,以重新编制这样你的数据的事实:

重新索引所有的文件从旧索引效率,使用滚动从旧检索文档批索引和批量API将它们推送到新索引中。

现在,为了解决部分更新的需要。重新索引 - 合并的方法可以粗略地分为四个阶段:

  1. 从索引乙从索引读取文件A
  2. 读取文档
  3. 合并文件
  4. 插入新的文档转换成乙

阶段1和4实际上是reindex调用的原始场景;现在需要与其他索引合并并合并文档。

我建议编写一个自定义脚本,并使用scroll以流式方式读取索引A,批量API用于从索引B检索文档,用于合并文档的自定义代码和用于插入文档的批量API。这种脚本的性能至少可以与原始的reindex实现相媲美。 (同时请确保您使用index performance tuning tips查看此页面,特别是增加/禁用index.refresh_interval。)

当然还有其他选项,与ElasticSearch无关,并且此问题的作者可能已经考虑了哪些选项像转储这两个索引,将它们与自定义代码结合起来并插入新索引)。

希望这会有所帮助。

+0

是的,但除非我弄错了,这种转换将应用于来自源索引的数据,而不适用于目标文档本身 – SebScoFr

+0

@SebScoFr是的,您是对的。我将删除我的答案,因为它不相关。 –