我在使用spring-data-es时出现了别名冲突问题,
我需要基于别名的每日滚动索引-A_Day1, A_Day2, ... A_now()
1. active_A - points to latest index - A_now()
*Persistence should be done on this alias*
2. search_A - points to all existing indexes + A_now()
*Search should be done on this alias*
我的文档实体拥有search_A的indexName,
@Document(indexName = "search_A", indexType="...")
,
这导致每次通过存储库(findBy ....)或通过ElasticTemplate.queryForPage(Query,Clazz.class)执行搜索查询时,都会在该别名上搜索 ,从而进行搜索所有现有索引,可正常工作。
问题持续存在-
使用spring-data-es存储库,我将实体保留在所有documents-persist-life-cycle中。
repository.save(Entity)
,
Spring-data-es将扫描indexName并持久化-意味着现在持久化是(search_A)别名,而不是active_A别名-不能按预期工作。
我想到了一些替代解决方案,这些解决方案都不是优雅且浪费的IMO:
在此发现了类似的问题-How to interact with elastic search Alias using Spring data 但我正在寻找一种解决方案,该解决方案不应覆盖/进行自定义实现,因为对于不使用给定存储库方法的情况而言,这太过分了。
在可能的情况下寻找更好的解决方案,或者寻求改变我的设计/想法的见解:)
答案 0 :(得分:1)
我认为,第三种方式是最优雅的方式,只需要在Spring方式中完成即可。
创建新类AbstractElasticsearchRepositoryEx,该类扩展了AbstractElasticsearchRepository,然后将其注册为配置文件中ES存储库的重写基类:
<elasticsearch:repositories base-package="com.amco.db.repository.elasticsearch" base-class="com.amco.db.repository.elasticsearch.AbstractElasticsearchRepositoryEx"/>
现在我们可以覆盖要扩展逻辑的任何存储库方法,例如保存()。我们可以确定内部,通过该方法接收的文档的类型,然后选择执行方式-该文档的特殊方式,该方式应使用 active_A 别名持久保存,而对于其他任何文档都应定期保存。>
这里是有关官方文档的链接:https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#repositories.customize-base-repository