Jeśli jest to mały zestaw danych (np. Rekordy 1K) , możesz po prostu określić size
:
curl localhost:9200/foo_index/_search?size=1000
Zapytania cały mecz nie jest potrzebna, ponieważ jest niejawny.
Jeśli masz średni zestaw danych, na przykład rekordy 1M , możesz nie mieć wystarczającej ilości pamięci, aby go załadować, więc potrzebujesz przewijania .
Przewijanie jest jak kursor w DB. W Elasticsearch zapamiętuje miejsce, w którym zostało przerwane i zachowuje ten sam widok indeksu (tj. Zapobiega wyszukiwaniu odejść z odświeżeniem , zapobiega scalaniu segmentów ).
Pod względem API musisz dodać parametr przewijania do pierwszego żądania:
curl 'localhost:9200/foo_index/_search?size=100&scroll=1m&pretty'
Otrzymujesz pierwszą stronę i identyfikator przewijania:
{
"_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAADEWbmJlSmxjb2hSU0tMZk12aEx2c0EzUQ==",
"took" : 0,
...
Pamiętaj, że zarówno odzyskany identyfikator przewijania, jak i limit czasu są ważne na następnej stronie . Częstym błędem jest tutaj określenie bardzo dużego limitu czasu (wartości scroll
), który obejmowałby przetwarzanie całego zestawu danych (np. 1M rekordów) zamiast jednej strony (np. 100 rekordów).
Aby uzyskać następną stronę, wpisz ostatni identyfikator przewijania i limit czasu, który powinien trwać do momentu pobrania następującej strony:
curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/_search/scroll' -d '{
"scroll": "1m",
"scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAADAWbmJlSmxjb2hSU0tMZk12aEx2c0EzUQ=="
}'
Jeśli masz dużo do wyeksportowania (np. Dokumenty 1B) , zrób to równolegle. Można to zrobić za pomocą przewijania w plasterkach . Powiedz, że chcesz wyeksportować 10 wątków. Pierwszy wątek wysłałby takie żądanie:
curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/test/_search?scroll=1m&size=100' -d '{
"slice": {
"id": 0,
"max": 10
}
}'
Otrzymujesz pierwszą stronę i identyfikator przewijania, dokładnie tak jak normalne żądanie przewijania. Zużyłbyś go dokładnie tak, jak zwykły zwój, z tą różnicą, że dostajesz 1/10 danych.
Inne wątki zrobiłyby to samo, z wyjątkiem id
1, 2, 3 ...