Wenn es sich um einen kleinen Datensatz handelt (z. B. 1K-Datensätze) , können Sie einfach Folgendes angeben size
:
curl localhost:9200/foo_index/_search?size=1000
Die Abfrage "Alle übereinstimmen" wird nicht benötigt, da sie implizit ist.
Wenn Sie über ein mittelgroßes Dataset wie 1M-Datensätze verfügen, verfügen Sie möglicherweise nicht über genügend Speicher, um es zu laden. Daher benötigen Sie einen Bildlauf .
Ein Bildlauf ist wie ein Cursor in einer Datenbank. In Elasticsearch merkt es sich, wo Sie aufgehört haben, und behält die gleiche Ansicht des Index bei (dh verhindert, dass der Sucher eine Aktualisierung durchführt , und verhindert, dass Segmente zusammengeführt werden ).
In Bezug auf die API müssen Sie der ersten Anforderung einen Bildlaufparameter hinzufügen:
curl 'localhost:9200/foo_index/_search?size=100&scroll=1m&pretty'
Sie erhalten die erste Seite und eine Bildlauf-ID zurück:
{
"_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAADEWbmJlSmxjb2hSU0tMZk12aEx2c0EzUQ==",
"took" : 0,
...
Denken Sie daran, dass sowohl die Bildlauf-ID, die Sie zurückerhalten, als auch das Zeitlimit für die nächste Seite gültig sind . Ein häufiger Fehler besteht darin, ein sehr großes Zeitlimit (Wert von scroll
) anzugeben , das die Verarbeitung des gesamten Datensatzes (z. B. 1 Million Datensätze) anstelle einer Seite (z. B. 100 Datensätze) abdeckt.
Um die nächste Seite zu erhalten, geben Sie die letzte Bildlauf-ID und eine Zeitüberschreitung ein, die bis zum Abrufen der folgenden Seite dauern soll:
curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/_search/scroll' -d '{
"scroll": "1m",
"scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAADAWbmJlSmxjb2hSU0tMZk12aEx2c0EzUQ=="
}'
Wenn Sie viel exportieren müssen (z. B. 1B-Dokumente) , möchten Sie parallelisieren. Dies kann über eine in Scheiben geschnittene Schriftrolle erfolgen . Angenommen, Sie möchten 10 Threads exportieren. Der erste Thread würde eine Anfrage wie folgt ausgeben:
curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/test/_search?scroll=1m&size=100' -d '{
"slice": {
"id": 0,
"max": 10
}
}'
Sie erhalten die erste Seite und eine Bildlauf-ID zurück, genau wie bei einer normalen Bildlaufanforderung. Sie würden es genau wie eine normale Schriftrolle verbrauchen, außer dass Sie 1/10 der Daten erhalten.
Andere Threads würden dasselbe tun, außer dass id
dies 1, 2, 3 ...