繁体   English   中英

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

[英]Elasticsearch Reindexing while updating documents?

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

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

ref 如何通过Java API重新索引ElasticSearch

很久以前

  • 创建索引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之间,重新索引自重建索引以来已编入索引的所有文档? 但是,在重命名别名和第二次重建索引之间,文档已经更新了
  • 或者我们应该在重建索引时锁定? 似乎是一个糟糕的解决方案..

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

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

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

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

正如我在我的问题中所提到的,你仍然需要处理潜在的'索引不存在'错误,因为你的应用程序检查是否存在别名和删除了别名之间的剩余竞争。 我希望有一个比'总是写两次并忽略错误'或'检查并希望最好'的答案更好的答案......

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

  • 保持第二个存储以保持真相
  • 处理不一致
  • 标记要在迁移后删除的删除文档
  • 您可以使用弹性搜索引擎存储在indecies之间创建快照
  • 您可以通知api用户稍后再次发送更改(索引完成时)

缺点:

  • 至少对于写操作,您有停机时间
  • 如果索引不能设置为allow-writes-again模式(自动恢复等),则需要更多逻辑来处理错误
  • 保持多个索引会导致使用更多的存储空间。

有关详细信息,请访问: https//www.elastic.co/guide/en/elasticsearch/reference/6.2/index-modules.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM