2014-12-15 21 views
6

Ich würde gerne wissen, ob es eine Möglichkeit gibt, für die elastische Suche anzugeben, dass ich keine fehlenden oder fehlerhaften Indizes in meiner Suchanfrage habe. Mit anderen Worten, ich habe eine Abfrage, die versucht, 7 verschiedene Indizes abzufragen, aber einer von ihnen könnte je nach den Umständen fehlen. Was ich wissen will ist, dass, wenn es eine Möglichkeit gibt zu sagen, vergessen Sie die gebrochene und holen Sie sich die Ergebnisse der anderen 6 Indizes?Elastische Suche mit fehlenden Indizes

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

Als eine Beispielabfrage können Sie das oben genannte finden.

Antwort

1

Haben Sie versucht, Index Aliases zu verwenden?

Anstatt sich auf einzelne Aliase zu beziehen, können Sie einen einzelnen Indexwert angeben. Dahinter können mehrere Indizes stehen.

Hier bin ich das Hinzufügen von zwei Indizes an den Alias ​​und Entfernen der fehlenden/gebrochenes:

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

Leider Olly, konnte nicht genau verstehen, was Sie gemeint. Ich könnte einen Alias ​​verwenden, um eine Abfrage auf 7 verschiedenen Indizes zu kombinieren, aber das kann ich schon. Was ich tun möchte, ist die Fähigkeit, einen dieser Indizes zu ignorieren, wenn es fehlschlägt. – ralzaul

+0

Ein Index würde ohne Grund nicht fehlschlagen, Sie müssen etwas getan haben, um es zu brechen (z. B. enthält es alte Daten). In diesem Fall würden Sie den fehlgeschlagenen Index aus dem Alias ​​identifizieren und entfernen. –

+0

nein im Grunde ohne jeden Fehler/Absturz/Fehlverhalten mein Index wird möglicherweise nicht erstellt. Sie sagen mir also, dass ich einen Alias ​​erstellen und den Status der einzelnen Indizes im Alias ​​überprüfen soll, um sie zu entfernen oder nicht? – ralzaul

6

Werfen Sie einen Blick auf die ignore_unavailable Option, die Teil des multi index syntax ist. Dies ist seit mindestens Version 1.3 verfügbar und erlaubt es Ihnen, fehlende oder geschlossene Indizes zu ignorieren, wenn Sie Suchen durchführen (neben anderen Multi-Index-Operationen).

Es wird in der Java API von IndicesOptions ausgesetzt. Beim Durchsuchen des Quellcodes fand ich eine setIndicesOptions()-Methode für den im Beispiel verwendeten SearchRequestBuilder. Sie müssen eine Instanz von IndicesOptions übergeben.

Es gibt verschiedene statische Factory-Methoden für die IndicesOptions-Klasse zum Erstellen einer Instanz mit Ihren spezifischen gewünschten Optionen. Sie würden wahrscheinlich von der Nutzung der bequemeren lenientExpandOpen() Factory-Methode (oder die veraltete Version, lenient(), je nach Version) profitieren, die ignore_unavailable = true setzt, allow_no_indices = true und expand_wildcards = open. Hier

ist eine modifizierte Version der Beispielabfrage, die das Verhalten liefern sollten Sie suchen:

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()); 
Verwandte Themen