elasticsearch - Elasticsearch Reindex API部分更新

标签 elasticsearch indexing logstash elasticsearch-5

因此,我们处于需要将Elasticsearch文档从一个索引重新索引到另一索引的情况。我们正在为此使用reindex API。尽管有时文档已经存在于目标索引中。设置version_type: "external"可以使它更新目标索引中的文档,这非常有用,除了它执行完全更新外,我希望它对该文档执行部分更新。
设置ctx.op = "partial"之类的东西会很不错,但是到目前为止似乎还没有实现。
任何用于实现此目的的替代想法将不胜感激。

PS:我想避免查询每个文档的源索引,并使用upsert将它们分别发送到目的地,出于性能方面的考虑,与reindex API相比,它似乎会比较慢。

最佳答案

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

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

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

(原始答案的结尾。)

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

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

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

To reindex all of the documents from the old index efficiently, use scroll to retrieve batches of documents from the old index, and the bulk API to push them into the new index.



现在,为了解决的需求,部分更新。重新索引和合并的过程可以大致分为四个阶段:
  • 从索引A读取文档
  • 从索引B读取文档
  • 合并文档
  • 将新文档插入B

  • 第1阶段和第4阶段实际上是reindex调用的原始场景;现在与众不同的是,需要与另一个索引合并并合并文档。

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

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

    希望这可以帮助。

    关于elasticsearch - Elasticsearch Reindex API部分更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46820331/

    相关文章:

    elasticsearch - 如何在elasticsearch中组合查询,must和must_not?

    elasticsearch - Elasticsearch 7.7 版本中跨多个索引的查询

    elasticsearch - 如何使 Elasticsearch 评分考虑字段长度

    javascript - 在某处调用数组的(未定义的)其余部分

    javascript - 从另一个 json 数组项中查找数组项的索引

    elasticsearch - 在 Elasticsearch 中使用GET API进行搜索查询

    jdbc - Logstash:错误 org.postgres.Driver 未加载

    elasticsearch - 在Elasticsearch中对术语使用通配符

    mysql - 创建索引然后插入还是插入然后创建索引?

    elasticsearch - MapperParsingException [无法解析[timestamp]];嵌套:IllegalArgumentException [无效格式: