别名与spring数据elasticsearch存储库搜索和持久冲突

问题描述 投票:1回答:1

我使用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的解决方案:

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

这里也发现了类似的问题 - How to interact with elastic search Alias using Spring data,但我正在寻找一种不会覆盖/制作自定义实现的解决方案,因为这对于不使用给定的存储库方法来说太多了。

如果可能,寻找更好的解决方案或改变我的设计/想法:)

spring elasticsearch annotations spring-data spring-data-elasticsearch
1个回答
1
投票

我认为,第三种方式是最优雅的方式,只需要采用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

© www.soinside.com 2019 - 2024. All rights reserved.