Se si tratta di un piccolo set di dati (ad es. Record 1K) , puoi semplicemente specificare size
:
curl localhost:9200/foo_index/_search?size=1000
Non è necessaria la corrispondenza di tutte le query , poiché è implicita.
Se si dispone di un set di dati di medie dimensioni, come i record 1M , potrebbe non essere disponibile memoria sufficiente per caricarlo, quindi è necessario uno scorrimento .
Una pergamena è come un cursore in un DB. In Elasticsearch, ricorda da dove eri rimasto e mantiene la stessa vista dell'indice (cioè impedisce al ricercatore di andare via con un aggiornamento , impedisce ai segmenti di fondersi ).
Per quanto riguarda l'API, devi aggiungere un parametro scroll alla prima richiesta:
curl 'localhost:9200/foo_index/_search?size=100&scroll=1m&pretty'
Si torna alla prima pagina e un ID di scorrimento:
{
"_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAADEWbmJlSmxjb2hSU0tMZk12aEx2c0EzUQ==",
"took" : 0,
...
Ricorda che sia l'ID di scorrimento che ottieni che il timeout sono validi per la pagina successiva . Un errore comune qui è quello di specificare un timeout molto grande (valore di scroll
), che coprirebbe per l'elaborazione dell'intero set di dati (ad esempio record 1M) anziché di una pagina (ad esempio 100 record).
Per ottenere la pagina successiva, inserisci l'ultimo ID di scorrimento e un timeout che dovrebbe durare fino al recupero della pagina seguente:
curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/_search/scroll' -d '{
"scroll": "1m",
"scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAADAWbmJlSmxjb2hSU0tMZk12aEx2c0EzUQ=="
}'
Se hai molto da esportare (ad es. Documenti 1B) , ti consigliamo di parallelizzare. Questo può essere fatto tramite scorrimento a fette . Supponi di voler esportare su 10 thread. Il primo thread emetterebbe una richiesta come questa:
curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/test/_search?scroll=1m&size=100' -d '{
"slice": {
"id": 0,
"max": 10
}
}'
Si ottiene la prima pagina e un ID di scorrimento, esattamente come una normale richiesta di scorrimento. Lo consumeresti esattamente come una normale pergamena, tranne per il fatto che ottieni 1/10 dei dati.
Altri thread farebbero lo stesso, tranne che id
sarebbe 1, 2, 3 ...