【问题标题】:Elasticsearch Reindexing while updating documents?更新文档时 Elasticsearch 重新索引?
【发布时间】:2017-02-27 10:52:17
【问题描述】:

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

我目前使用的 Java API 还没有重新索引功能,所以使用批量可以解决我的问题。所以解决方案看起来像这样

参考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 之间,重新索引自重新索引以来已被索引的所有文档?但是仍然会出现在重命名别名和第二次重新索引之间更新文档的情况
  • 或者我们应该在重新索引时锁定?似乎是一个糟糕的解决方案..

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

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

    但是,在重新索引所有文档时会发生什么情况,在开始重新索引的文档会从用户那里更新。或者在重新索引和重命名别名之间发生上述情况?

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

    要回答您的问题,您需要在重新索引之前创建第二个别名。我称之为duplicate_write_alias 并且您有您的应用程序,如果它看到第二个别名,请先写入旧索引,然后通过这两个别名写入新​​索引。 (订单对于取消潜在的比赛很重要)。索引完成后,您的索引进程将删除此 duplicate_write_alias 并将您的 MY_INDEX 别名移动到新的 MY_INDEX_2,如上所述。在one atomic command 中进行别名切换。

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

    【讨论】:

      【解决方案2】:

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

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

      缺点:

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

      更多信息请看这里: https://www.elastic.co/guide/en/elasticsearch/reference/6.2/index-modules.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-03
        • 1970-01-01
        • 1970-01-01
        • 2019-01-23
        • 1970-01-01
        相关资源
        最近更新 更多