Elasticsearch reindex API部分更新

时间:2017-10-18 22:40:25

标签: elasticsearch indexing logstash elasticsearch-5

因此,我们需要将Elasticsearch文档从一个索引重新索引到另一个索引。我们正在使用reindex API。虽然有时文档已经存在于目标索引中。设置version_type: "external"使得目标索引中的文档更新效果很好,除了它执行完整更新,我希望它对该文档执行部分更新。 设置ctx.op = "partial"之类的东西会很好但是它显然没有像今天那样实现。 任何实现这一目标的替代想法都将受到赞赏。

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

1 个答案:

答案 0 :(得分:0)

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

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

理论上,您可以对要重新编制索引的文档应用任何转换。

(原始答案结束。)

实施自定义reindex-and-merge

正如问题的作者指出的那样,如果需要合并两个文档,即生成的索引中已存在的文档和新文档,则无效。

Elasticsearch _reindex方法在version 2.3中引入,被认为是实验性的;看起来它只是scroll查询与bulk insert API的组合。我基于以下事实得出这个结论:“权威指南”中的this page建议以这种方式重新索引数据:

  

要有效地重新索引旧索引中的所有文档,请使用scroll从旧索引中检索批量文档,并使用批量API将它们推送到新索引中。

现在,要解决部分更新的需要。 reindex-and-merge的过程大致可分为四个阶段:

  1. 从索引A中读取文件
  2. 阅读索引B的文件
  3. 合并文件
  4. 将新文件插入B
  5. 第1和第4阶段实际上是reindex电话的原始方案;现在它的不同之处在于需要加入另一个索引并合并文档。

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

    当然还有其他选项,与ElasticSearch无关,而且这个问题的作者可能已经考虑过了(比如转储两个索引,使用自定义代码加入它们并插入新索引)。

    希望这有帮助。