2016-02-24 6 views
0

Как я могу параметризовать индекс 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"); 

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

+0

[Этот ответ] (http://stackoverflow.com/questions/33894618/creating-indices-name-dynamically-in-elasticsearch-using-spring-data-elasticsear?s=1|2.2393) или [этот другой один] (http://stackoverflow.com/questions/24333327/rolling-index-dynamic-index-name-in-spring-data-elasticsearch?s=2|2.0926) должен помочь. – Val

+0

Я считаю, что ни то, ни другое (не найдено и не изучалось раньше). Это касается не жесткого кодирования имени индекса, но мне нужно иметь возможность звонить ко многим различным индексам. Я знаю только имя индекса через клиентский параметр (не во время компиляции или загрузки) – Daniel

+0

Gotcha, давайте найдем еще одно решение: – Val

ответ

0

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

FacetedPage<T> search(SearchQuery searchQuery); 

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

Я надеюсь, что он отвечает

0

Даже при том, что боб инициализации во время загрузки, вы можете достичь его родниковой языка выражений:

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

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

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

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

Что следует отметить, не поделиться этой боб в нескольких потоке, который может испортить ваш индекс.

Адрес a working example.