我使用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,@Document(indexName = "search_A", indexType="...")
的indexName,这会导致每次执行搜索查询,通过存储库(findBy ....)或通过ElasticTemplate.queryForPage(Query,Clazz.class)来搜索此别名 - 从而搜索所有现有的索引,这些索引按预期工作。
持续出现问题 -
使用spring-data-es存储库我在所有文档中持久化实体 - persist-life-cycle。
repository.save(Entity)
,
Spring-data-es将扫描indexName和persist-意味着现在持久性是(search_A)别名而不是active_A别名 - 它不能按预期工作。
我想到了一些不优雅且浪费IMO的解决方案:
这里也发现了类似的问题 - How to interact with elastic search Alias using Spring data,但我正在寻找一种不会覆盖/制作自定义实现的解决方案,因为这对于不使用给定的存储库方法来说太多了。
如果可能,寻找更好的解决方案或改变我的设计/想法:)
我认为,第三种方式是最优雅的方式,只需要采用Spring方式。
创建新类AbstractElasticsearchRepositoryEx,它扩展AbstractElasticsearchRepository,然后将其注册为配置文件中ES存储库的重写基类:
<elasticsearch:repositories base-package="com.amco.db.repository.elasticsearch" base-class="com.amco.db.repository.elasticsearch.AbstractElasticsearchRepositoryEx"/>
现在我们可以覆盖任何我们想要扩展逻辑的存储库方法,例如保存()。我们可以在内部确定我们在该方法中收到哪种类型的Document并选择执行方式 - 特别针对该Document,使用active_A别名应该是持久的,并且对于任何其他别名都是常规的。
这里有关于它的官方文档的链接:https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#repositories.customize-base-repository