Moyen efficace de récupérer tous les ID dans ElasticSearch

Quelle est la façon la plus rapide d'obtenir tous les _ids d'un certain index d'ElasticSearch? Est-ce possible en utilisant une simple requête? L'un de mes index contient environ 20 000 documents.

44
demandé sur Mahoni 2013-07-06 01:28:10

8 réponses

Edit: Veuillez lire @Aleck le Landgrave de Réponse, trop

Vous voulez juste le elasticsearch-interne _id champ? Ou un id champ de l'intérieur de vos documents?

Pour les anciens, essayez

curl http://localhost:9200/index/type/_search?pretty=true -d '
{ 
    "query" : { 
        "match_all" : {} 
    },
    "stored_fields": []
}
'

Note 2017 Mise À Jour: Le post d'origine inclus "fields": [] mais depuis, le nom a changé et stored_fields est la nouvelle valeur.

Le résultat contiendra uniquement les "métadonnées" de votre des documents

{
  "took" : 7,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "failed" : 0
  },
  "hits" : {
    "total" : 4,
    "max_score" : 1.0,
    "hits" : [ {
      "_index" : "index",
      "_type" : "type",
      "_id" : "36",
      "_score" : 1.0
    }, {
      "_index" : "index",
      "_type" : "type",
      "_id" : "38",
      "_score" : 1.0
    }, {
      "_index" : "index",
      "_type" : "type",
      "_id" : "39",
      "_score" : 1.0
    }, {
      "_index" : "index",
      "_type" : "type",
      "_id" : "34",
      "_score" : 1.0
    } ]
  }
}

pour ce dernier, si vous voulez inclure un champ de votre document, il suffit de l'ajouter à la fields array

curl http://localhost:9200/index/type/_search?pretty=true -d '
{ 
    "query" : { 
        "match_all" : {} 
    },
    "fields": ["document_field_to_be_returned"]
}
'
52
répondu Thorsten 2017-12-12 02:16:41

Mieux utiliser faites défiler et scan pour obtenir la liste des résultats pour que elasticsearch n'ait pas à classer et trier les résultats.

elasticsearch-dsl python lib ceci peut être accompli par:

from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search

es = Elasticsearch()
s = Search(using=es, index=ES_INDEX, doc_type=DOC_TYPE)

s = s.fields([])  # only get ids, otherwise `fields` takes a list of field names
ids = [h.meta.id for h in s.scan()]

journal de la Console:

GET http://localhost:9200/my_index/my_doc/_search?search_type=scan&scroll=5m [status:200 request:0.003s]
GET http://localhost:9200/_search/scroll?scroll=5m [status:200 request:0.005s]
GET http://localhost:9200/_search/scroll?scroll=5m [status:200 request:0.005s]
GET http://localhost:9200/_search/scroll?scroll=5m [status:200 request:0.003s]
GET http://localhost:9200/_search/scroll?scroll=5m [status:200 request:0.005s]
...

Remarque:: scroll tire des lots de résultats d'une requête et garde le curseur ouvert pendant une durée donnée (1 minute, 2 minutes, que vous pouvez mettre à jour); scanner désactive tri. scan la fonction helper renvoie un générateur python qui peut être itéré en toute sécurité.

31
répondu Aleck Landgraf 2017-06-08 18:08:55

une autre option

curl 'http://localhost:9200/index/type/_search?pretty=true&fields='

retour _index, _type, _id et _score.

14
répondu Brian Low 2014-08-18 17:07:26
_source" sur le terrain.

GET /_search
{
    "_source": false,
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

"fields" a été désapprouvée. (Erreur: "Le champ [champs] n'est plus pris en charge, veuillez utiliser [stored_fields] pour récupérer les champs stockés ou _source de filtrage si le champ n'est pas stocké")

12
répondu Nav 2016-11-14 04:25:52

vous pouvez aussi le faire en python, ce qui vous donne une bonne liste:

import elasticsearch
es = elasticsearch.Elasticsearch()

res = es.search(
    index=your_index, 
    body={"query": {"match_all": {}}, "size": 30000, "fields": ["_id"]})

ids = [d['_id'] for d in res['hits']['hits']]
3
répondu Alix Martin 2015-05-28 07:24:19

inspiré par la réponse de @Aleck-Landgraf, pour moi cela a fonctionné en utilisant directement scanner fonction en standard elasticsearch l'API python:

from elasticsearch import Elasticsearch
from elasticsearch.helpers import scan
es = Elasticsearch()
for dobj in scan(es, 
                 query={"query": {"match_all": {}}, "fields" : []},  
                 index="your-index-name", doc_type="your-doc-type"): 
        print dobj["_id"],
2
répondu Robert Lujo 2016-01-16 22:39:47

développement des 2 réponses par @Robert-Lujo et @Aleck-Landgraf (quelqu'un avec les permissions peut volontiers déplacer ceci à un commentaire): si vous ne souhaitez pas imprimer mais obtenir tout à l'intérieur d'une liste à partir de l'retourné générateur, voici ce que j'utilise:

from elasticsearch import Elasticsearch,helpers
es = Elasticsearch(hosts=[YOUR_ES_HOST])
a=helpers.scan(es,query={"query":{"match_all": {}}},scroll='1m',index=INDEX_NAME)#like others so far

IDs=[aa['_id'] for aa in a]
1
répondu sandro scodelller 2016-02-10 17:16:31
Url -> http://localhost:9200/<index>/<type>/_query
http method -> DELETE
Query -> {"query": {"match_all": {}}, "size": 30000, "fields": ["_id"]})
-1
répondu Ankireddy Polu 2016-10-05 02:00:06