Псевдоним с поиском репозитория эластичных данных Spring и сохранением конфликта

у меня возникают проблемы с конфликтом псевдонимов с использованием 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*

Мой объект документа содержит indexName search_A, @Document(indexName = "search_A", indexType = "..."), Это приводит к тому, что каждый раз, когда выполняется поисковый запрос, либо через репозиторий (findBy....), либо через ElasticTemplate.queryForPage(Query, Clazz.class) для поиска на этом псевдониме - и, таким образом, поиск по всем существующим индексам, который работает, как ожидалось.

Проблема возникает на постоянном -

Используя репозиторий spring-data-es, я сохраняю объекты во всех циклах документального сохранения.

repository.save(Entity),

Spring-data-es будет сканировать indexName и сохраняться, что означает, что теперь постоянство относится к (search_A) псевдониму и НЕ для псевдонима active_A, который не работает, как ожидалось.

Я подумал о нескольких обходные решения, которые не являются элегантными и расточительными IMO:

  1. Переопределить шаг save() в моем DAO - затем перед вызовом репозиторий.save - изменить значение аннотации во время выполнения на псевдоним сохранения, затем после настойчивости - снова измените его на поисковый псевдоним.
  2. Измените @Document(indexName=#{dynamicDailyBased()}) с помощью Spring SPEL, но тогда я все еще застрял с необходимостью псевдонима для поиска. поскольку spring-data-es потребуется indexName для параметров поиска.
  3. Переопределить все поиск происходит в одном месте, а затем с помощью .withIndices("псевдоним") --> это приведет к тому, что я потеряю все весенние репозиторий самостоятельной реализации -> тонны стандартного кода.

Аналогичная проблема выявлена ​​здесь - Как взаимодействовать с эластичным поиском Alias ​​с использованием данных Spring но я ищу решение, которое не переопределяет/не создает пользовательскую реализацию, так как это было бы слишком много, чтобы не использовать заданные методы репозитория.

Ищу лучшее решение, если это возможно, или понимание того, как изменить свой дизайн / идею :)

2
0
948
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я думаю, что третий способ является самым элегантным, просто нужно сделать это способом Spring.

Создайте новый класс AbstractElasticsearchRepositoryEx, который расширяет AbstractElasticsearchRepository, а затем зарегистрируйте его как переопределенный базовый класс для репозиториев ES в файле конфигурации:

<elasticsearch:repositories base-package = "com.amco.db.repository.elasticsearch" base-class = "com.amco.db.repository.elasticsearch.AbstractElasticsearchRepositoryEx"/>

Теперь мы можем переопределить любой метод репозитория, который мы хотим расширить логикой, например. спасти(). Мы могли внутри определить, какой тип Документа мы получили в этом методе, и выбрать способ исполнения - специальный для этого Документа, который должен быть персистентным с использованием псевдонима активный_А, и обычный для любого другого.

Вот ссылка на официальную документацию по этому поводу: https://docs.spring.io/spring-data/elasticsearch/docs/current/reference/html/#repositories.customize-base-repository

Другие вопросы по теме