【问题标题】:Spring data elasticsearch - migration documents to new indexSpring data elasticsearch - 迁移文档到新索引
【发布时间】:2021-07-02 13:00:59
【问题描述】:

我正在开发用于搜索目的的 Spring 应用程序。我使用 elasticsearch spring 数据库来创建索引和管理文档。对于查询(搜索),我使用了来自 elasticsearch 的常规客户端 - 而不是来自 spring 数据。

我注意到弹簧数据只有在弹性搜索中丢失时才会创建索引。每当将新字段添加到使用 @Document 注释的类时,映射都不会更新。因此,在刚刚添加的字段中搜索会导致错误的请求。

该应用程序现已在生产中运行。此应用程序有多个实例正在运行。我想更改索引的映射并保留现有数据。

我在互联网和文档中找到的解决方案是使用重新索引功能创建新索引、复制数据(并可能即时更改它们)并将别名切换为新的。

我用这种方法实现了解决方案。迁移过程在应用程序启动时运行(如果需要 - 由 env 参数决定)。 但是,在我看来,这种方法既便宜又伪劣。使用无痛脚本更改文档很容易出错。很难测试迁移。我需要手动保存有关我正在运行迁移的环境的信息,并设置正确的索引名称。在部署期间,我需要密切关注流程以检查一切是否正常。可能还需要进行一些手动更改。如果在此期间重新索引过程失败怎么办?

有很多问题困扰着我。我在寻找为什么没有图书馆,类似于 Flyway。另外,我知道无法更改索引的映射,但可以添加新字段,并且 spring 数据弹性搜索不支持。

请大家给我一些建议,你如何处理这种情况?

【问题讨论】:

    标签: spring elasticsearch spring-data-elasticsearch


    【解决方案1】:

    这不是一般如何进行这些迁移的答案,而是对 Spring Data Elasticsearch 可以做什么以及它做什么的一些说明。

    如果您正在为您的实体使用 Spring Data Elasticsearch 存储库并且该索引在应用程序启动时不存在,则 Spring Data Elasticsearch 会使用相应的映射创建一个索引。它不会自行更新索引的映射。

    您仍然可以从程序代码更新索引映射,IndexOperations.putMapping(java.lang.Class<?>) 就是为此。因此,如果您向实体添加新属性,然后在应用程序启动时使用更改的实体类调用此方法,则索引映射将被更新。这只能将新字段添加到映射中,而不能更改现有字段 - 这是 Elasticsearch 的限制。

    如果您的应用程序在多个实例中运行,您可以在更新或正确处理错误时同步它们。

    如果您添加字段,请确保在添加数据之前更新映射,否则 Elasticsearch 将自动检测到新的字段类型,您将不得不执行手动重新索引过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 2017-02-27
      • 2021-02-04
      相关资源
      最近更新 更多