2014-12-15 11 views
6

Vorrei sapere se esiste un modo per specificare la ricerca elastica che non mi interessa indici mancanti o errati nella mia query di ricerca. In altre parole, ho una query che tenta di interrogare 7 indici diversi, ma uno di essi potrebbe mancare a seconda delle circostanze. Quello che voglio sapere è che se c'è un modo per dire, dimentica quello rotto e prendi i risultati degli altri 6 indici?Ricerca elastica per la gestione degli indici mancanti

SearchRequestBuilder builder = elasticsearchClient.getClient().prepareSearch(indices) 
      .setQuery(Query.buildQueryFrom(term1, term2)) 
      .addAggregation(AggregationBuilders.terms('term') 
             .field('field') 
             .shardSize(shardSize) 
             .size(size) 
             .minDocCount(minCount)); 

Come query di esempio è possibile trovare quanto sopra.

risposta

1

Hai provato a utilizzare Index Aliases?

Invece di fare riferimento a singoli alias, è possibile specificare un singolo valore di indice. Dietro questo possono essere diversi indici.

Qui sto aggiungendo due indici per l'alias e la rimozione del mancante/rotto uno:

curl -XPOST 'http://localhost:9200/_aliases' -d ' 
{ 
    "actions" : [ 
     { "remove" : { "index" : "bad-index", "alias" : "alias-index" } }, 
     { "add" : { "index" : "good-index1", "alias" : "alias-index" } }, 
     { "add" : { "index" : "good-index2", "alias" : "alias-index" } } 
    ] 
}' 
+0

spiacenti Olly, non poteva capire esattamente quello che volevi dire. Potrei usare un alias per combinare una query su 7 diversi indici, ma sono già in grado di farlo. Quello che voglio fare è la possibilità di ignorare uno di quegli indici se fallisce. – ralzaul

+0

Un indice non fallirebbe senza motivo, è necessario aver fatto qualcosa per romperlo (ad esempio contiene vecchi dati). In tal caso, identificare e rimuovere l'indice non riuscito dall'alias. –

+0

praticamente senza alcun errore/crash/comportamento scorretto il mio indice potrebbe non essere creato. Quindi mi stai dicendo di creare un alias e controllare lo stato dei singoli indici nell'alias per rimuoverli o no? – ralzaul

6

Date un'occhiata al ignore_unavailable opzione , che fa parte del multi index syntax. Questo è stato disponibile almeno dalla versione 1.3 e consente di ignorare gli indici mancanti o chiusi durante l'esecuzione di ricerche (tra le altre operazioni con più indici).

È esposto nell'API Java entro il IndicesOptions. Navigando attraverso il codice sorgente, ho trovato che esiste un metodo setIndicesOptions() sul SearchRequestBuilder utilizzato nell'esempio. È necessario passarlo un'istanza di IndicesOptions.

Esistono vari metodi di produzione statici nella classe IndicesOptions per la creazione di un'istanza con le opzioni desiderate specifiche. Si sarebbe probabilmente trarre vantaggio dall'utilizzo del più conveniente lenientExpandOpen() metodo factory (o la versione deprecata, lenient(), a seconda della versione), che stabilisce ignore_unavailable = true, allow_no_indices = vero e expand_wildcards = aperto.

Ecco una versione modificata della query di esempio che dovrebbe fornire il comportamento che stai cercando:

SearchRequestBuilder builder = elasticsearchClient.getClient().prepareSearch(indices) 
     .setQuery(Query.buildQueryFrom(term1, term2)) 
     .addAggregation(AggregationBuilders.terms('term') 
            .field('field') 
            .shardSize(shardSize) 
            .size(size) 
            .minDocCount(minCount)) 
     .setIndicesOptions(IndicesOptions.lenientExpandOpen()); 
Problemi correlati