【问题标题】:Elasticsearch reindex API partial updateElasticsearch 重新索引 API 部分更新
【发布时间】:2017-10-18 22:40:24
【问题描述】:

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

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

【问题讨论】:

    标签: elasticsearch indexing logstash elasticsearch-5


    【解决方案1】:

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

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

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

    (原答案结束。)


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

    正如问题的作者所指出的,如果需要合并两个文档,一个已经存在于结果索引中的文档和一个新文档,这将无济于事。

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

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

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

    1. 从索引 A 读取文档
    2. 从索引 B 读取文档
    3. 合并文档
    4. 将新文档插入 B

    第一阶段和第四阶段实际上是reindex调用的原始场景;现在的不同之处在于需要加入另一个索引并合并文档。

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

    当然还有其他选项,它们与 ElasticSearch 不相关,并且此问题的作者可能已经考虑过(例如转储两个索引,将它们与自定义代码连接并插入新索引)。

    希望这会有所帮助。

    【讨论】:

    • 是的,但除非我弄错了,否则该转换将应用于来自源索引的数据,而不是目标文档本身
    • @SebScoFr 是的,你是对的。我将删除我的答案,因为它不相关。
    猜你喜欢
    • 1970-01-01
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多