Динамический индекс с SpringData ElasticSearch

Как я могу параметризовать индекс SpringData ElasticSearch во время выполнения?

Например, модель данных:

@Document(indexName = "myIndex")
public class Asset {

    @Id
    public String id;

    // ...
}

и репозиторий:

public interface AssetRepository extends ElasticsearchCrudRepository<Asset, String> {

    Asset getAssetById(String assetId);
}

Я знаю, что могу заменить myIndex параметром, но этот параметр будет разрешен во время создания экземпляра/загрузки. У нас одинаковая структура активов для нескольких клиентов/арендаторов, у которых есть свой индекс. Мне нужно что-то вроде этого:

public interface AssetRepository extends ElasticsearchCrudRepository<Asset, String> {

    Asset getAssetByIdFromIndex(String assetId, String index);
}

или это

repoInstance.forIndex("myOtherIndex").getAssetById("123");

Я знаю, что это не работает из коробки, но есть ли способ программно «взломать» его?


person Daniel    schedule 24.02.2016    source источник
comment
Этот ответ или другой должно помочь.   -  person Val    schedule 24.02.2016
comment
Я тоже не верю (нашел и изучил оба раньше). Речь идет о том, чтобы не жестко кодировать имя индекса, но мне нужно иметь возможность вызывать множество разных индексов. Я знаю только имя индекса через параметр клиента (не во время компиляции или загрузки)   -  person Daniel    schedule 24.02.2016
comment
Попался, тогда давайте найдем другое решение :)   -  person Val    schedule 24.02.2016


Ответы (2)


Несмотря на то, что bean-компонент инициализируется во время загрузки, вы все равно можете добиться этого с помощью языка выражений Spring:

@Bean
Name name() {
    return new Name();
}

@Document(indexName="#{name.name()}")
public class Asset{}

Вы можете изменить свойство компонента, чтобы изменить индекс, который вы хотите сохранить/искать:

    assetRepo.save(new Asset(...));
    name.setName("newName");
    assetRepo.save(new Asset(...));

Следует заметить, что нельзя использовать этот компонент в нескольких потоках, что может испортить ваш индекс.

Вот рабочий пример.

person Tony    schedule 30.06.2017
comment
принимающая страница не найдена по вышеуказанной ссылке. - person Nimble Fungus; 29.07.2021

org.springframework.data.elasticsearch.repository.ElasticSearchRepository есть метод

FacetedPage<T> search(SearchQuery searchQuery);

где SearchQuery может использовать несколько индексов для поиска.

надеюсь ответит

person Rahul    schedule 24.02.2016