因此,我们需要将Elasticsearch文档从一个索引重新索引到另一个索引。我们正在使用reindex API。虽然有时文档已经存在于目标索引中。设置version_type: "external"
使得目标索引中的文档更新效果很好,除了它执行完整更新,我希望它对该文档执行部分更新。
设置ctx.op = "partial"
之类的东西会很好但是它显然没有像今天那样实现。
任何实现这一目标的替代想法都将受到赞赏。
PS:我想避免查询每个文档的源索引,并使用upsert将它们单独发送到目的地,出于性能原因,与reindex API相比,这似乎相当慢。
答案 0 :(得分:0)
免责声明:此答案已更新。
要实现部分更新,您可以定义script)。
理论上,您可以对要重新编制索引的文档应用任何转换。
(原始答案结束。)
正如问题的作者指出的那样,如果需要合并两个文档,即生成的索引中已存在的文档和新文档,则无效。
Elasticsearch _reindex
方法在version 2.3中引入,被认为是实验性的;看起来它只是scroll查询与bulk insert API的组合。我基于以下事实得出这个结论:“权威指南”中的this page建议以这种方式重新索引数据:
要有效地重新索引旧索引中的所有文档,请使用scroll从旧索引中检索批量文档,并使用批量API将它们推送到新索引中。
现在,要解决部分更新的需要。 reindex-and-merge的过程大致可分为四个阶段:
第1和第4阶段实际上是reindex
电话的原始方案;现在它的不同之处在于需要加入另一个索引并合并文档。
我建议编写自定义脚本并使用scroll
以流式方式读取索引A,使用批量API从索引B中检索文档,使用自定义代码合并文档,使用批量API插入文档。此类脚本的性能至少与原始reindex
实现相当。 (另请确保您使用index performance tuning tips查看此页面,特别是增加/停用index.refresh_interval
。)
当然还有其他选项,与ElasticSearch无关,而且这个问题的作者可能已经考虑过了(比如转储两个索引,使用自定义代码加入它们并插入新索引)。
希望这有帮助。