与 spring 数据 elasticsearch 存储库搜索别名并持续冲突
aliasing with spring data elasticsearch repository search and persist conflict
我在使用 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="...")
,
这导致每次执行搜索查询时,通过存储库 (findBy....) 或通过 ElasticTemplate.queryForPage(Query, Clazz.class) 搜索 在此别名 - 从而搜索所有现有索引,按预期工作。
持久化出现问题 -
使用 spring-data-es 存储库我在所有文档持久生命周期中持久化实体。
repository.save(Entity)
,
Spring-data-es 将扫描 indexName 和 persist- 意味着现在持久化是 (search_A) 别名 而不是 active_A 别名 - 没有按预期工作。
我想到了几个 变通解决方案 不优雅和浪费 IMO:
- 覆盖我的 DAO 中的 save() 步骤 - 然后在调用之前
repository.save - 将运行时的注释值更改为持久性别名,然后
持久性之后-再次更改它以搜索别名。
- 使用 spring SPEL 更改 @Document(indexName=#{dynamicDailyBased()}),但我仍然需要别名进行搜索。因为 spring-data-es 需要 indexName 作为搜索选项。
- 覆盖所有
搜索发生在一个地方 - 然后使用 .withIndices("alias") -->
这将导致我丢失所有 spring 存储库 self-impl --> tons
样板代码。
这里发现了一个类似的问题 -
但我正在寻找一个不是 overriding/making 自定义实现的解决方案,因为这对于不使用给定的存储库方法来说太多了。
寻找更好的解决方案(如果可能)或改变我的设计/想法的见解:)
我认为,第三种方式是最优雅的,只需要按照Spring方式进行即可。
创建新的 class AbstractElasticsearchRepositoryEx,它扩展了 AbstractElasticsearchRepository,然后将其注册为配置文件中 ES 存储库的覆盖基础 class:
<elasticsearch:repositories base-package="com.amco.db.repository.elasticsearch" base-class="com.amco.db.repository.elasticsearch.AbstractElasticsearchRepositoryEx"/>
现在我们可以覆盖任何我们想要扩展逻辑的存储库方法,例如救球()。我们可以在内部确定,我们在该方法中收到了哪种类型的文档,并选择执行方式 - 特别针对该文档,应该使用 active_A 别名和常规对于任何其他人。
这里link关于它的官方文档:https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#repositories.customize-base-repository
我在使用 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="...")
,
这导致每次执行搜索查询时,通过存储库 (findBy....) 或通过 ElasticTemplate.queryForPage(Query, Clazz.class) 搜索 在此别名 - 从而搜索所有现有索引,按预期工作。
持久化出现问题 -
使用 spring-data-es 存储库我在所有文档持久生命周期中持久化实体。
repository.save(Entity)
,
Spring-data-es 将扫描 indexName 和 persist- 意味着现在持久化是 (search_A) 别名 而不是 active_A 别名 - 没有按预期工作。
我想到了几个 变通解决方案 不优雅和浪费 IMO:
- 覆盖我的 DAO 中的 save() 步骤 - 然后在调用之前 repository.save - 将运行时的注释值更改为持久性别名,然后 持久性之后-再次更改它以搜索别名。
- 使用 spring SPEL 更改 @Document(indexName=#{dynamicDailyBased()}),但我仍然需要别名进行搜索。因为 spring-data-es 需要 indexName 作为搜索选项。
- 覆盖所有 搜索发生在一个地方 - 然后使用 .withIndices("alias") --> 这将导致我丢失所有 spring 存储库 self-impl --> tons 样板代码。
这里发现了一个类似的问题 -
寻找更好的解决方案(如果可能)或改变我的设计/想法的见解:)
我认为,第三种方式是最优雅的,只需要按照Spring方式进行即可。
创建新的 class AbstractElasticsearchRepositoryEx,它扩展了 AbstractElasticsearchRepository,然后将其注册为配置文件中 ES 存储库的覆盖基础 class:
<elasticsearch:repositories base-package="com.amco.db.repository.elasticsearch" base-class="com.amco.db.repository.elasticsearch.AbstractElasticsearchRepositoryEx"/>
现在我们可以覆盖任何我们想要扩展逻辑的存储库方法,例如救球()。我们可以在内部确定,我们在该方法中收到了哪种类型的文档,并选择执行方式 - 特别针对该文档,应该使用 active_A 别名和常规对于任何其他人。
这里link关于它的官方文档:https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#repositories.customize-base-repository