gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 22:28:12 24 4
gpt4 key购买 nike

我在使用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。它按预期工作。

持久出现问题-

使用spring-data-es存储库,我将实体保留在所有documents-persist-life-cycle中。
repository.save(Entity)

Spring-data-es将扫描indexName并进行持久化-这意味着持久性将持久化为(search_A)别名 而不是持久化为active_A别名- 无法按预期的方式工作

我想到了一些 解决方案解决方案,它们不是优雅且浪费的IMO:
  • 在我的DAO中覆盖save()步骤-然后在调用之前
    repository.save-在运行时将注释值更改为持久性别名,然后
    持久性后-再次将其更改为搜索别名。
  • 使用spring SPEL更改@Document(indexName =#{dynamicDailyBased()}),但是后来我仍然需要别名来搜索。因为spring-data-es将需要indexName作为其搜索选项。
  • 覆盖全部
    搜索发生在一个地方-然后使用.withIndices(“alias”)->
    这将导致我失去所有的spring仓库自我隐喻->吨
    样板代码。

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

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

    最佳答案

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

    关于spring - 使用Spring数据Elasticsearch存储库搜索进行别名并保持冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55205979/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com