2016-02-04 6 views
52

Wir rufen Informationen aus Elasticsearch 2.1 ab und ermöglichen dem Benutzer, durch die Ergebnisse zu blättern. Wenn fordert der Benutzer eine hohe Seitenzahl wir die folgende Fehlermeldung erhalten:Elasticsearch 2.1: Das Ergebnisfenster ist zu groß (index.max_result_window)

Fenster Ergebnis zu groß ist, von + Größe als weniger sein muss, oder gleich zu: [10000] aber war [10020]. Sehen Sie die Scroll-API für eine effizientere Methode , um große Datenmengen anzufordern. Diese Grenze kann die durch Änderung eingestellt werden [index.max_result_window] Indexebene Parameter

Die elastische Doku sagt, dass dies wegen der hohen Speicherverbrauch und die Scroll-api zu verwenden:

Werte höher Dann können Sie pro signifikante Teile des Heap-Speichers konsumieren und die Suche durchführen. Es ist am sichersten dieses Wert zu verlassen, da es sich um eine Verwendung der Scroll-api für jede tief https://www.elastic.co/guide/en/elasticsearch/reference/2.x/breaking_21_search_changes.html#_from_size_limits

Das Ding Scrollen ist, dass ich nicht wollen, große Datensätze abzurufen. Ich möchte nur eine Scheibe aus dem Datensatz abrufen, die in der Ergebnismenge sehr hoch ist. Auch das Scrollen Doku sagt:

Scrolling nicht für Echtzeit-Benutzer gedacht fordert https://www.elastic.co/guide/en/elasticsearch/reference/2.2/search-request-scroll.html

Dies lässt mich mit einigen Fragen:

1) Würde der Speicherverbrauch wirklich niedriger sein (any Wenn ja, warum) Wenn ich die scrollende API verwende, um zum Ergebnis 10020 zu scrollen (und alles unter 10000 zu ignorieren), anstatt eine "normale" Suchanfrage für das Ergebnis 10000-10020 auszuführen?

2) Es scheint nicht, dass die Scroll-API eine Option für mich ist, aber dass ich "index.max_result_window" erhöhen muss. Hat jemand damit Erfahrung?

3) Gibt es noch andere Optionen, um mein Problem zu lösen?

Antwort

15

Auf den folgenden Seiten in der elastischen Dokumentation Vortrag über tief Paging:

https://www.elastic.co/guide/en/elasticsearch/guide/current/pagination.html https://www.elastic.co/guide/en/elasticsearch/guide/current/_fetch_phase.html

Je nach Größe Ihrer Dokumente, die Anzahl der Scherben, und die Hardware, die Sie verwenden, Paging 10.000 bis 50.000 Ergebnisse (1.000 bis 5.000 Seiten) tief sollte perfekt machbar sein. Aber mit groß genug von Werte, kann der Sortiervorgang in der Tat sehr schwer werden, mit riesigen Mengen an CPU, Arbeitsspeicher und Bandbreite . Aus diesem Grund raten wir stark von tiefem Paging ab.

+0

Also, hier sollten wir tiefe Paginierung aufgeben, richtig? Grundsätzlich ist es nicht wichtig, 4000 Seiten für einen einzelnen Betrachter zu pagen. Sagen wir, Google-Suche, scrollen wir kaum zu Seite 8 oder 9, um Ergebnisse zu überprüfen. Normalerweise kümmern wir uns nur um die Top 3-5 Seiten, die Google uns gibt. – dotslash

+2

Können wir die Scroll-API verwenden, wenn wir eine starke Paginierung benötigen? –

+2

Aber wenn wir die Sortierfunktion aktivieren, sagen wir auf einer E-Commerce-Site. wenn Benutzer Artikel mit dem höchsten Preis sehen möchten. Das Ergebnis wird anders sein, wenn wir nach dem höchsten Preis sortieren, wenn wir nach der niedrigsten Seite sortieren, aber zur letzten Seite gehen, oder? da wir die Anzahl der Ergebnisse beschränken, kann zugegriffen werden. irgendwelche Arbeit dafür? –

55

Wenn Sie große tief Paginierung müssen, denke ich nur eine Variante der Lösung Wert max_result_window zu erhöhen

curl -XPUT "http://localhost:9200/my_index/_settings" -d '{ "index" : { "max_result_window" : 500000 } }' 

Der Anstieg der Speichernutzung, ich nicht für Werte von ~ 100k

+0

Ich habe den gleichen Fehler ''Ergebnisfenster ist zu groß, von + Größe muss kleiner als oder gleich sein: [10000] aber war [47190]. In der Scroll-API finden Sie eine effizientere Möglichkeit, große Datenmengen anzufordern. Dieses Limit kann durch Ändern des Indexlevel-Parameters [index.max_result_window] gesetzt werden. ') Es heißt, es habe 4719 Seiten (jede Seite 10 Ergebnisse). und ich denke, dass dein Vorschlag funktioniert. – dotslash

+0

Dies ist eine gute Lösung für kleine Dokumente unter 500000 – Ezzat

+1

Ich benutze ES v2.2.0 und ich musste die Nutzdaten in '{" max_result_window ": 500000}' ändern, damit dies funktioniert. Also wurde der curl-Befehl - 'curl -XPUT 'http: // localhost: 9200/mein_index/_settings" -d' {"max_result_window": 500000} '' –

2
gefunden

Verwenden Sie die Scroll-API, um mehr als 10.000 Ergebnisse zu erhalten.

Scroll example in ElasticSearch NEST API

ich es wie folgt verwendet:

private static Customer[] GetCustomers(IElasticClient elasticClient) 
{ 
    var customers = new List<Customer>(); 
    var searchResult = elasticClient.Search<Customer>(s => s.Index(IndexAlias.ForCustomers()) 
          .Size(10000).SearchType(SearchType.Scan).Scroll("1m")); 

    do 
    { 
     var result = searchResult; 
     searchResult = elasticClient.Scroll<Customer>("1m", result.ScrollId); 
     customers.AddRange(searchResult.Documents); 
    } while (searchResult.IsValid && searchResult.Documents.Any()); 

    return customers.ToArray(); 
} 
-5

Der Hauptgrund, warum Sie diesen Fehler bekommen - es ist becouse Sie in einer falschen Weise Elasticsearch verwenden. ES ist eine Suchmaschine. Es ist nicht effektiv, viele Elemente oder viele Seiten Ihrer Daten zu erhalten. Vielleicht versuchen Sie, alle Ihre Daten mit der elastischen Suche zu betreiben, nicht nur relevante Ergebnisse zu suchen? Es ist falsch.

Also sollten Sie es für die Suche verwenden. Und wie ich denke, ist es nicht notwendig, mehr als 10 000 Ergebnisgegenstände zu bekommen. Zum Beispiel gibt Google nur die ersten 1000 Ergebnisse zurück.

0

Wenn Sie mehr als 10.000 Ergebnisse wünschen, ist die Speicherauslastung in allen Datenknoten sehr hoch, da bei jeder Abfrage mehr Ergebnisse zurückgegeben werden müssen. Wenn Sie dann mehr Daten und mehr Shards haben, ist das Zusammenführen dieser Ergebnisse ineffizient. Außerdem wird der Filterkontext zwischengespeichert, was wiederum zu mehr Speicher führt. Sie müssen ausprobieren, wie viel genau Sie nehmen. Wenn Sie viele Anfragen in einem kleinen Fenster erhalten, sollten Sie mehrere Abfragen für mehr als 10k durchführen und sie im Code zusammenführen, der weniger Anwendungsspeicher benötigt, als wenn Sie die Fenstergröße erhöhen.

0

2) Es scheint nicht, dass die Scroll-API eine Option für mich ist, aber ich muss "index.max_result_window" erhöhen. Hat jemand damit Erfahrung?

-> Sie können diesen Wert in Indexvorlagen definieren. Die Vorlage ist nur für neue Indizes gültig. Sie müssen also entweder alte Indizes nach dem Erstellen der Vorlage löschen oder warten, bis neue Daten in elasticsearch aufgenommen wurden.

{ "Ordnung": 1, "template": "index_template *", "Einstellungen": { "index.number_of_replicas": "0", "index.number_of_shards": "1", "index.max_result_window": 2147483647 },

9

Die richtige Lösung wäre Scrollen zu verwenden.
Wenn Sie jedoch die Ergebnisse search Renditen über 10.000 Ergebnisse erweitern möchten, können Sie es leicht tun mit Kibana:

Zum Dev Tools und poste nur folgendes zu Ihrem Index (your_index_name), specifing, was der neue sein würde max Ergebnisfenster

enter image description here

PUT your_index_name/_settings 
{ 
    "max_result_window" : 500000 
} 

Wenn alles gut geht, sollten Sie die folgende Erfolgs Reaktion sehen:

{ 
    "acknowledged": true 
} 
+1

Ich habe versucht, dies im elasticsearch-Code zu tun (put_settings usw. ..) und viele Fehler erreicht. Das spart mir Stunden! Vielen Dank! – cpres