2016-02-24 3 views
0

Comment puis-je paramétrer un index SpringData ElasticSearch lors de l'exécution?Index dynamique avec SpringData ElasticSearch

Par exemple, le modèle de données:

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

    @Id 
    public String id; 

    // ... 
} 

et le dépôt:

public interface AssetRepository extends ElasticsearchCrudRepository<Asset, String> { 

    Asset getAssetById(String assetId); 
} 

Je sais que je peux remplacer myIndex avec un paramètre, mais ce paramètre sera résolu lors de l'instanciation/boot. Nous avons la même structure d'actifs pour plusieurs clients/locataires, qui ont leur propre indice. Ce que je besoin est quelque chose comme ceci:

public interface AssetRepository extends ElasticsearchCrudRepository<Asset, String> { 

    Asset getAssetByIdFromIndex(String assetId, String index); 
} 

ou cette

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

Je sais que cela ne fonctionne pas hors de la boîte, mais est-il un moyen de programme « hack » il?

+0

[Cette réponse] (http://stackoverflow.com/questions/33894618/creating-indices-name-dynamically-in-elasticsearch-using-spring-data-elasticsear?s=1|2.2393) ou [cette autre un] (http://stackoverflow.com/questions/24333327/rolling-index-dynamic-index-name-in-spring-data-elasticsearch?s=2|2.0926) devrait aider. – Val

+0

Je ne crois pas non plus (trouvé et étudié les deux avant). Il ne s'agit pas de coder en dur le nom de l'index, mais je dois pouvoir appeler plusieurs index différents. Je ne connais que le nom de l'index via un paramètre client (pas au moment de la compilation ou du démarrage) – Daniel

+0

Gotcha, trouvons donc une autre solution :) – Val

Répondre

0

org.springframework.data.elasticsearch.repository.ElasticSearchRepository a une méthode

FacetedPage<T> search(SearchQuery searchQuery); 

où SearchQuery peut prendre plusieurs indices à utiliser pour la recherche.

J'espère qu'il répond

0

Même si le grain est init au démarrage, vous pouvez toujours y parvenir par le langage d'expression de printemps:

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

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

Vous pouvez modifier la propriété du bean pour modifier l'index souhaitez enregistrer/recherche:

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

que faut-il remarqué est de ne pas partager ce haricot en fil multiple, qui peut gâcher votre index.

Voici a working example.