首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与spring数据elasticsearch存储库搜索和持久化冲突混叠

与spring数据elasticsearch存储库搜索和持久化冲突混叠
EN

Stack Overflow用户
提问于 2019-03-17 10:16:08
回答 1查看 1.2K关注 0票数 2

我用弹簧数据把冲突问题混在一起,

我需要每天的滚转索引- A_Day1, A_Day2, ... A_now()与混叠:

代码语言:javascript
复制
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别名--并不像预期的那样工作。

我想出了很少的解决方案,这些解决方案既不优雅,也不浪费,海事组织:

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

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

如果可能的话,寻找一个更好的解决方案或洞察力来改变我的设计/想法:)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-25 08:59:39

我想,第三条路是最优雅的,只要用春天的方式就行了。

创建新类AbstractElasticsearchRepositoryEx,该类扩展AbstractElasticsearchRepository,然后将其注册为配置文件中ES存储库的重写基类:

代码语言:javascript
复制
<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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55205979

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档