Se for um pequeno conjunto de dados (por exemplo, 1K registros) , você pode simplesmente especificar size
:
curl localhost:9200/foo_index/_search?size=1000
A correspondência de todas as consultas não é necessária, pois está implícita.
Se você possui um conjunto de dados de tamanho médio, como registros de 1 milhão , talvez não tenha memória suficiente para carregá-lo, portanto, é necessário um scroll .
Um pergaminho é como um cursor em um banco de dados. No Elasticsearch, ele lembra de onde você parou e mantém a mesma visualização do índice (ou seja, impede que o pesquisador desapareça com uma atualização , impede a mesclagem de segmentos ).
Em termos de API, você deve adicionar um parâmetro de rolagem à primeira solicitação:
curl 'localhost:9200/foo_index/_search?size=100&scroll=1m&pretty'
Você recebe a primeira página e um ID de rolagem:
{
"_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAADEWbmJlSmxjb2hSU0tMZk12aEx2c0EzUQ==",
"took" : 0,
...
Lembre-se de que o ID da rolagem que você recebe e o tempo limite são válidos para a próxima página . Um erro comum aqui é especificar um tempo limite muito grande (valor descroll
), que cobriria o processamento de todo o conjunto de dados (por exemplo, 1 milhão de registros) em vez de uma página (por exemplo, 100 registros).
Para obter a próxima página, preencha o último ID de rolagem e um tempo limite que deve durar até buscar a seguinte página:
curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/_search/scroll' -d '{
"scroll": "1m",
"scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAADAWbmJlSmxjb2hSU0tMZk12aEx2c0EzUQ=="
}'
Se você tiver muito o que exportar (por exemplo, documentos 1B) , precisará paralelizar. Isso pode ser feito via rolagem fatiada . Digamos que você queira exportar em 10 threads. O primeiro thread emitia uma solicitação como esta:
curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/test/_search?scroll=1m&size=100' -d '{
"slice": {
"id": 0,
"max": 10
}
}'
Você recebe de volta a primeira página e um ID de rolagem, exatamente como uma solicitação de rolagem normal. Você o consumiria exatamente como uma rolagem normal, exceto pelo fato de obter 1/10 dos dados.
Outros threads fariam o mesmo, exceto que id
seriam 1, 2, 3 ...