Elasticsearch在更新文档时重新编制索引?

时间:2016-10-18 08:46:12

标签: elasticsearch

如果我更改了索引的映射并希望重新索引,该怎么办?

我目前正在使用尚未具有reindex功能的Java API,因此使用bulk可以解决我的问题。所以解决方案看起来像这样

ref How to reindex in ElasticSearch via Java API

很久以前

  • 创建索引MY_INDEX_1
  • 为MY_INDEX_1
  • 创建映射
  • 创建别名MY_INDEX_1 - > MY_INDEX
  • 在MY_INDEX中创建文档

重新索引的时间!

  • 列表项
  • 创建索引MY_INDEX_2
  • 为MY_INDEX_2
  • 创建映射
  • 滚动搜索+将所有文档从MY_INDEX_1批量处理到MY_INDEX_2

重命名和删除旧索引

  • 创建别名MY_INDEX_2 - > MY_INDEX
  • 删除别名MY_INDEX_1 - > MY_INDEX
  • 删除索引MY_INDEX_1

但是会发生什么,在重新索引所有文档时,会从用户更新在开头重新编制索引的文档。 或者重新索引和重命名别名之间的上述幸福感?

可能的解决方案?

  • 一种方法是使用外部版本,例如它不会覆盖具有更高版本的文档
  • 或者可以用另一种方式解决?
  • 或者在重命名别名和删除my_index_1之间,重新索引自重建索引以来已编入索引的所有文档?但是,在重命名别名和第二次重建索引之间更新文档的情况仍然如此
  • 或者我们应该在重建索引时锁定?似乎是一个糟糕的解决方案..

2 个答案:

答案 0 :(得分:0)

我认为这是你真正的问题:

  

但是会发生什么,在重新索引所有文档时,会从用户更新在开头重新编制索引的文档。或者重新索引和重命名别名之间的上述幸福感?

我只是asked a question非常接近,但仍有问题需要单独解决。但是,我的研究让我回答了这个问题。有关详细信息和参考资料,请参阅问题。

要回答您的问题,请在重建索引之前创建第二个别名。我称之为duplicate_write_alias并且你有你的应用程序,如果它看到这个第二个别名,先通过两个别名写入旧索引和新索引。 (该命令对取消潜在比赛非常重要)。索引编制完成后,您的索引编制过程将删除此duplicate_write_alias,并将您的MY_INDEX别名移至新MY_INDEX_2,如上所述。别名切换到one atomic command

正如我在我的问题中所指出的,由于应用程序检查别名是否存在以及别名被删除之间的剩余竞争,您仍然必须处理潜在的'索引不存在'错误。我希望有一个比'总是写两次并忽略错误'或'检查并希望最好'的答案更好的答案......

答案 1 :(得分:0)

我认为还有另一种(更丑陋的方式): 您可以在重新索引时禁用对源索引的写操作,这会导致临时的不可用的api,您不必:

  • 维护第二个存储空间以保存真相
  • 交易不一致
  • 要删除的标记文档,应在迁移后删除
  • 您可以使用弹性搜索引擎存储来创建索引之间的快照
  • 您可以向您的api用户发出信号,以便稍后(在完成索引编制后)再次发送他们的更改

缺点:

  • 您至少要在写操作方面停机
  • 如果索引不会设置为再次允许写入模式(自动恢复等),则需要更多的逻辑来处理错误
  • 保留多个索引会导致使用更多的存储空间。

有关更多信息,请参见此处: https://www.elastic.co/guide/en/elasticsearch/reference/6.2/index-modules.html