Якщо це невеликий набір даних (наприклад, 1K записів) , ви можете просто вказати size
:
curl localhost:9200/foo_index/_search?size=1000
Матч всіх запитів не потрібно, так як це мається на увазі.
Якщо у вас набір даних середнього розміру, як-то записи 1М , у вас може не вистачити пам'яті для завантаження, тому вам потрібен прокрутка .
Прокрутка - це як курсор у БД. У програмі Elasticsearch він пам’ятає, де ви зупинилися, і зберігає однаковий вигляд індексу (тобто запобігає пошуку шукача відійти з оновленням , запобігає злиття сегментів ).
API-розумно, вам потрібно додати параметр прокрутки до першого запиту:
curl 'localhost:9200/foo_index/_search?size=100&scroll=1m&pretty'
Ви отримуєте назад першу сторінку та ідентифікатор прокрутки:
{
"_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAADEWbmJlSmxjb2hSU0tMZk12aEx2c0EzUQ==",
"took" : 0,
...
Пам'ятайте, що і ідентифікатор прокрутки, який ви отримаєте назад, і час очікування дійсні для наступної сторінки . Поширена помилка тут полягає в тому, щоб вказати дуже великий час очікування (значення scroll
), який охоплював би обробку всього набору даних (наприклад, 1М записів) замість однієї сторінки (наприклад, 100 записів).
Щоб отримати наступну сторінку, заповніть останній ідентифікатор прокрутки та час очікування, який повинен тривати до отримання наступної сторінки:
curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/_search/scroll' -d '{
"scroll": "1m",
"scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAADAWbmJlSmxjb2hSU0tMZk12aEx2c0EzUQ=="
}'
Якщо вам потрібно багато експортувати (наприклад, 1B документів) , вам потрібно паралелізувати. Це можна зробити за допомогою нарізаного прокрутки . Скажіть, що ви хочете експортувати на 10 потоків. Перший потік видасть такий запит:
curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/test/_search?scroll=1m&size=100' -d '{
"slice": {
"id": 0,
"max": 10
}
}'
Ви отримуєте назад першу сторінку та ідентифікатор прокрутки, точно як звичайний запит на прокрутку. Ви б споживали його точно як звичайний прокруток, за винятком того, що ви отримуєте 1/10 частини даних.
Інші потоки зробили б те саме, за винятком id
1, 2, 3 ...