我正在开发用于搜索的spring应用程序。我使用elasticsearch spring数据库来创建索引和管理文档。对于查询(搜索),我使用了来自elasticsearch的常规客户端,而不是来自spring数据。
我注意到spring数据只在elasticsearch中缺少索引时创建索引。每当新字段被添加到用@document注解的类时,Map将不会被更新。因此,在刚刚添加的字段中搜索会导致错误的请求。
该应用程序现在已经可以在生产中使用了。此应用程序有多个示例正在运行。我想更改索引的Map并保留现有数据。
我在互联网和文档中找到的解决方案是创建新索引,使用reindex功能复制数据(可能还可以动态更改),并将别名切换到新的。
我用这种方法实现了解决方案。迁移过程在应用程序启动时运行(如果需要-由env param决定)。然而,在我看来,这种方法是廉价和劣质的。使用无痛脚本更改文档容易出错。很难测试迁移。我需要手动保存运行迁移的环境的信息,并设置适当的索引名。在部署期间,我需要密切关注进程,以检查是否一切正常工作。可能还需要一些手动更改。如果同时重新编制索引程序失败怎么办?
有很多问题困扰着我。我在搜索为什么没有图书馆,类似于flyway。另外,我知道不可能更改索引的Map,但是可以添加新字段,这在SpringDataElasticSearch中不受支持。
你们能给我一些建议吗?你们怎么处理这种情况?
1条答案
按热度按时间1hdlvixo1#
这并不是关于如何进行这些迁移的答案,而是对SpringDataElasticSearch可以做什么以及它可以做什么的一些澄清。
如果您正在为实体使用spring data elasticsearch存储库,并且在应用程序启动时不存在索引,那么spring data elasticsearch将创建具有相应Map的索引。它不会自行更新索引的Map。
尽管如此,您仍然可以从程序代码中更新索引Map
IndexOperations.putMapping(java.lang.Class<?>)
为了这个。因此,如果向实体添加一个新属性,然后在应用程序启动时使用更改的实体类调用此方法,则索引Map将被更新。这只能向Map中添加新字段,而不能更改现有字段-这是elasticsearch的限制。如果您的应用程序在多个示例中运行,则由您来同步更新或正确处理错误。
如果添加字段,请确保在添加数据之前更新Map,否则elasticsearch将自动检测新字段类型,并且您必须手动重新编制索引。