我用弹簧数据把冲突问题混在一起,
我需要每天的滚转索引- 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*我的文档实体保存着indexName of search_A,@Document(indexName = "search_A", indexType="..."),这导致每次执行搜索查询,要么通过存储库(findBy.)或者通过ElasticTemplate.queryForPage(查询,Clazz.class)在这个别名上搜索,从而搜索所有现有的索引,如预期的那样工作的。
问题出现在持久性上-
使用spring es存储库,我在所有文档中持久化实体--持久化-生命周期。
repository.save(Entity),
Spring--es将扫描indexName并持久化--这意味着持久性现在是指向(search_A)别名,而不是active_A别名--并不像预期的那样工作。
我想出了很少的解决方案,这些解决方案既不优雅,也不浪费,海事组织:
这里也发现了一个类似的问题-- How to interact with elastic search Alias using Spring data,但是我正在寻找一种解决方案,它不会覆盖/定制实现,因为这对于不使用给定的存储库方法来说太大了。
如果可能的话,寻找一个更好的解决方案或洞察力来改变我的设计/想法:)
发布于 2019-03-25 08:59:39
我想,第三条路是最优雅的,只要用春天的方式就行了。
创建新类AbstractElasticsearchRepositoryEx,该类扩展AbstractElasticsearchRepository,然后将其注册为配置文件中ES存储库的重写基类:
<elasticsearch:repositories base-package="com.amco.db.repository.elasticsearch" base-class="com.amco.db.repository.elasticsearch.AbstractElasticsearchRepositoryEx"/>现在我们可以覆盖任何想要扩展逻辑的存储库方法,例如save()。我们可以确定内部,我们在该方法中接收到的文档类型,并选择执行的方式--对于该文档来说是特殊的,应该使用active_A别名持久化,对于任何其他文档应该是常规的。
在这里链接到关于它的官方文档:https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#repositories.customize-base-repository
https://stackoverflow.com/questions/55205979
复制相似问题