使用Spring数据Elasticsearch存储库搜索进行别名并保持冲突

时间:2019-03-17 10:16:08

标签: spring elasticsearch annotations spring-data spring-data-elasticsearch

我在使用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:

  1. 在我的DAO中覆盖save()步骤-然后在调用之前 repository.save-在运行时将注释值更改为持久性别名,然后 持久性后-再次将其更改为搜索别名。
  2. 使用spring SPEL更改@Document(indexName =#{dynamicDailyBased()}),但随后我仍然需要别名来搜索。因为spring-data-es将需要indexName作为其搜索选项。
  3. 覆盖所有 搜索发生在一个地方-然后使用.withIndices(“ alias”)-> 这将导致我失去所有的spring仓库自我隐喻->吨 样板代码。

在此发现了类似的问题-How to interact with elastic search Alias using Spring data 但我正在寻找一种解决方案,该解决方案不应覆盖/进行自定义实现,因为对于不使用给定存储库方法的情况而言,这太过分了。

在可能的情况下寻找更好的解决方案,或者寻求改变我的设计/想法的见解:)

1 个答案:

答案 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