当前位置: 首页 > 知识库问答 >
问题:

Spring data elasticsearch-将文档迁移到新索引

闻梓
2023-03-14

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

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

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

我在互联网和文档中找到的解决方案是创建新索引,使用reindex功能复制数据(可能会动态更改),并将别名切换到新的别名。

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

有很多问题困扰着我。我在搜索为什么没有图书馆,类似于Flyway。此外,我知道不可能更改索引的映射,但可以添加新字段,这在spring data elasticsearch中不受支持。

你们能给我一些建议吗?你们如何处理这种情况?

共有1个答案

容磊
2023-03-14

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

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

不过,您可以从程序代码中更新索引映射,这里有索引操作。putMapping(java.lang.Class

如果您的应用程序在多个实例中运行,则由您来同步更新或正确处理错误。

如果添加字段,请确保在添加数据之前更新映射,否则Elasticsearch将自动检测到新字段类型,您必须手动重新编制索引。

 类似资料:
  • 我正在使用OpenJDK 12中的Nashorn JS引擎。纳肖恩似乎遭到了反对。我正在寻找可用的替代方案。我找到了GraalVM,但我不确定这是不是最好的。如何从Java执行GraalVM JavaScript?你有什么例子吗? Nashorn用的是Java: 在Nashorn中,我创建了一个WrappedMongoDatabase,它扩展了AbstractJSObject。在那里,我添加了一些

  • 问题内容: 将Express.js从版本2更新到了版本3,以下调用中断了,因为它不再存在于V3中: 有一个迁移指南说: (使用中间件+ res.locals) 但是我很困惑如何做到这一点。是否有一个更具体的示例说明如何进行迁移? 相关的SO post: Node.js Express3.0 问题答案: 我有同样的问题 session.user ,只是通过了解该app.use功能必须是固定的, 在

  • Phinx 可以让开发者简洁的修改和维护数据库。 它避免了人为的手写 SQL 语句,它使用强大的 PHP API 去管理数据库迁移。开发者可以使用版本控制管理他们的数据库迁移。

  • 我正试图从maven迁移到gradle,但CheckStyle出现了一个奇怪的错误。 这是我得到的错误 如何让gradle使用最新版本的CheckStyle?值得注意的是,我的使用了maven checkstyle 6.10.1和6.8

  • 我要迁移一个JavaApplet通过JNLP启动,作为一个Java的Web Start应用程序,并遇到一些麻烦/误解... 我得到的资源之一是这样的:6迁移JavaAppletJavaWeb Start和JNLP: 让我们开始吧,但是: 目前,该应用程序是一个小程序(),过去是通过将小程序标记嵌入到HTML中来启动的,小程序标记指的是JNLP。 现在,由于所有浏览器都放弃了对小程序的支持,我应该将

  • Angular 是使用 TypeScript 构建的,并且支持向 Angular 提供元信息的装饰器。 TypeScript 的装饰器会让语法感觉更加“自然”,尽管有可能使用 Angular 没有的功能。