Quel est le moyen le plus rapide d’obtenir tous les _ids d’un index donné d’ElasticSearch? Est-ce possible en utilisant une requête simple? Un de mes index contient environ 20 000 documents.
Edit: Veuillez lire aussi la réponse de @Aleck Landgraf
Vous voulez juste le elasticsearch-internal _id
champ? Ou un champ id
à partir de vos documents?
Pour les premiers, essayez
curl http://localhost:9200/index/type/_search?pretty=true -d '
{
"query" : {
"match_all" : {}
},
"stored_fields": []
}
'
Note 2017 Update: Le poste a été inclus à l'origine "fields": []
mais depuis lors, le nom a changé et stored_fields
est la nouvelle valeur.
Le résultat ne contiendra que les "métadonnées" de vos 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 souhaitez inclure un champ de votre document, ajoutez-le simplement au tableau fields
curl http://localhost:9200/index/type/_search?pretty=true -d '
{
"query" : {
"match_all" : {}
},
"fields": ["document_field_to_be_returned"]
}
'
Mieux vaut utiliser scroll and scan pour obtenir la liste des résultats, ainsi elasticsearch ne doit pas classer ni trier les résultats.
Avec le 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 extrait des lots de résultats d'une requête et laisse le curseur ouvert pendant un laps de temps donné (1 minute, 2 minutes, que vous pouvez mettre à jour); scan désactive le tri. La fonction d'assistance scan
renvoie un générateur python) qui peut être itéré en toute sécurité.
Pour elasticsearch 5.x, vous pouvez utiliser le champ " _ source ".
GET /_search
{
"_source": false,
"query" : {
"term" : { "user" : "kimchy" }
}
}
"fields"
est obsolète. (Erreur: "Le champ [champs] n'est plus pris en charge, utilisez [stocké-champs] pour récupérer les champs stockés ou le filtrage _source si le champ n'est pas stocké")
Une autre option
curl 'http://localhost:9200/index/type/_search?pretty=true&fields='
retournera _index, _type, _id et _score.
vous pouvez aussi le faire en python, ce qui vous donne une liste appropriée:
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']]
En développant les 2 réponses de @ Robert-Lujo et @ Aleck-Landgraf (une personne avec les autorisations peut volontiers le déplacer vers un commentaire): si vous ne souhaitez pas imprimer mais récupérez tout dans une liste du générateur retourné, 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]
Inspiré par la réponse de @ Aleck-Landgraf, cela fonctionnait pour moi en utilisant directement la fonction scan de elasticsearch python API:
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"],