S'il s'agit d'un petit ensemble de données (par exemple, 1 000 enregistrements) , vous pouvez simplement spécifier size
:
curl localhost:9200/foo_index/_search?size=1000
La requête match all n'est pas nécessaire, car elle est implicite.
Si vous avez un ensemble de données de taille moyenne, comme des enregistrements 1M , vous n'avez peut-être pas assez de mémoire pour le charger, vous avez donc besoin d'un défilement .
Un défilement est comme un curseur dans une base de données. Dans Elasticsearch, il se souvient de l'endroit où vous vous êtes arrêté et conserve la même vue de l'index (c'est-à-dire empêche le chercheur de s'en aller avec un rafraîchissement , empêche les segments de fusionner ).
Côté API, vous devez ajouter un paramètre de défilement à la première requête:
curl 'localhost:9200/foo_index/_search?size=100&scroll=1m&pretty'
Vous récupérez la première page et un ID de défilement:
{
"_scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAADEWbmJlSmxjb2hSU0tMZk12aEx2c0EzUQ==",
"took" : 0,
...
N'oubliez pas que l'ID de défilement que vous récupérez et le délai d'expiration sont valides pour la page suivante . Une erreur courante consiste à spécifier un délai d'attente très important (valeur descroll
), qui couvrirait le traitement de l'ensemble de données (par exemple 1 million d'enregistrements) au lieu d'une page (par exemple 100 enregistrements).
Pour obtenir la page suivante, remplissez le dernier ID de défilement et un délai d'expiration qui devrait durer jusqu'à la récupération de la page suivante:
curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/_search/scroll' -d '{
"scroll": "1m",
"scroll_id": "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAADAWbmJlSmxjb2hSU0tMZk12aEx2c0EzUQ=="
}'
Si vous avez beaucoup à exporter (par exemple des documents 1B) , vous voudrez paralléliser. Cela peut être fait via un rouleau en tranches . Supposons que vous souhaitiez exporter sur 10 threads. Le premier thread émettrait une requête comme celle-ci:
curl -XPOST -H 'Content-Type: application/json' 'localhost:9200/test/_search?scroll=1m&size=100' -d '{
"slice": {
"id": 0,
"max": 10
}
}'
Vous récupérez la première page et un ID de défilement, exactement comme une demande de défilement normale. Vous le consommeriez exactement comme un défilement normal, sauf que vous obtenez 1 / 10ème des données.
D'autres threads feraient de même, sauf que ce id
serait 1, 2, 3 ...