web-dev-qa-db-fra.com

ELK: Comment récupérer plus de 10000 résultats/événements dans Elastic-search

Problème: récupération de plus de 10 000 résultats en recherche élastique via une recherche dans une requête GET /.

GET hostname:port /myIndex/_search { 
    "size": 10000,
    "query": {
        "term": { "field": "myField" }
    }
}

J'utilise l'option de taille en sachant que:

index.max_result_window = 100000

Mais si ma requête a la taille de 650 000 documents par exemple, voire davantage, comment puis-je récupérer tous les résultats dans un seul GET?

Je lisais des informations sur les API SCROLL, FROM-TO et PAGINATION, mais toutes ne fournissent jamais plus de 10 000 livres.

Voici l'exemple du forum Elasticsearch que j'utilise:

GET /_search?scroll=1m

Quelqu'un peut-il fournir un exemple où vous pouvez récupérer tous les documents d'une requête de recherche GET?

Merci beaucoup.

13
Franco

Le défilement est la voie à suivre si vous souhaitez récupérer un nombre élevé de documents, car il dépasse largement la limite par défaut de 10 000, ce qui peut être augmenté.

La première demande doit spécifier la requête que vous voulez effectuer et le paramètre scroll avec la durée avant l'expiration du contexte de recherche (1 minute dans l'exemple ci-dessous)

POST /index/type/_search?scroll=1m
{
    "size": 1000,
    "query": {
        "match" : {
            "title" : "elasticsearch"
        }
    }
}

En réponse à ce premier appel, vous obtenez un _scroll_id que vous devez utiliser pour effectuer le second appel:

POST /_search/scroll 
{
    "scroll" : "1m", 
    "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAAD4WYm9laVYtZndUQlNsdDcwakFMNjU1QQ==" 
}

Dans chaque réponse suivante, vous obtiendrez un nouveau _scroll_id que vous devrez utiliser pour le prochain appel jusqu'à ce que vous ayez récupéré la quantité de documents dont vous avez besoin.

Donc, dans le pseudo-code, cela ressemble un peu à ceci:

# first request
response = request('POST /index/type/_search?scroll=1m')
docs = [ response.hits ]
scroll_id = response._scroll_id

# subsequent requests
while (true) {
   response = request('POST /_search/scroll', scroll_id)
   docs.Push(response.hits)
   scroll_id = response._scroll_id
}
18
Val

Une autre option est la balise search_after . Joind avec un mécanisme de tri, vous pouvez enregistrer votre dernier élément dans la première déclaration, puis demander des résultats après ce dernier élément.

    GET Twitter/_search
    {
     "size": 10,
        "query": {
            "match" : {
                "title" : "elasticsearch"
            }
        },
        "search_after": [1463538857, "654323"],
        "sort": [
            {"date": "asc"},
            {"_id": "desc"}
        ]
    }

Travaillé pour moi Mais jusqu'à présent, obtenir plus de 10 000 Dokuments n'est vraiment pas facile.

0
Dan

exemple de défilement nodeJS utilisant elascticsearch :

const elasticsearch = require('elasticsearch');
const elasticSearchClient = new elasticsearch.Client({ Host: 'esURL' });

async function getAllData(query) {
  const result = await elasticSearchClient.search({
    index: '*',
    scroll: '10m',
    size: 10000,
    body: query,
  });

  const retriever = async ({
    data,
    total,
    scrollId,
  }) => {
    if (data.length >= total) {
      return data;
    }

    const result = await elasticSearchClient.scroll({
      scroll: '10m',
      scroll_id: scrollId,
    });

    data = [...data, ...result.hits.hits];

    return retriever({
      total,
      scrollId: result._scroll_id,
      data,
    });
  };

  return retriever({
    total: result.hits.total,
    scrollId: result._scroll_id,
    data: result.hits.hits,
  });
}
0
zooblin