Каков самый быстрый способ получить все _ID определенного индекса из ElasticSearch? Можно ли использовать простой запрос? Один из моих индексов содержит около 20 000 документов.
Эффективный способ получения всех _ids в ElasticSearch
Ответ 1
Изменить: Пожалуйста, прочитайте @Aleck Landgraf Answer, тоже
Вам просто нужен поле elasticsearch-internal _id
? Или поле id
из ваших документов?
Для первого, попробуйте
curl http://localhost:9200/index/type/_search?pretty=true -d '
{
"query" : {
"match_all" : {}
},
"stored_fields": []
}
'
Примечание 2017 Обновление: Сообщение первоначально включало "fields": []
, но с тех пор имя изменилось, а stored_fields
- новое значение.
Результат будет содержать только "метаданные" ваших документов.
{
"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
} ]
}
}
Для последнего, если вы хотите включить поле из своего документа, просто добавьте его в массив fields
curl http://localhost:9200/index/type/_search?pretty=true -d '
{
"query" : {
"match_all" : {}
},
"fields": ["document_field_to_be_returned"]
}
'
Ответ 2
Лучше использовать прокрутку и сканирование, чтобы получить список результатов, поэтому elasticsearch не должен оценивать и сортировать результаты.
С elasticsearch-dsl
python lib это может быть выполнено:
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()]
Журнал консоли:
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]
...
Примечание: прокрутка вытягивает партии результатов запроса и удерживает курсор открытым в течение заданного промежутка времени (1 минута, 2 минуты, которую вы можете обновить); сканирование отключает сортировку. Вспомогательная функция scan
возвращает генератор питона, который можно безопасно повторить.
Ответ 3
Другой вариант
curl 'http://localhost:9200/index/type/_search?pretty=true&fields='
вернет _index, _type, _id и _score.
Ответ 4
Для elasticsearch 5.x вы можете использовать поле _ source.
GET /_search
{
"_source": false,
"query" : {
"term" : { "user" : "kimchy" }
}
}
"fields"
устарел.
(Ошибка: "Поле [поля] больше не поддерживается, используйте [stored_fields] для извлечения сохраненных полей или фильтрации источника, если поле не сохраняется" )
Ответ 5
Вдохновленный ответом @Aleck-Landgraf, для меня это сработало с помощью функции scan в стандартном API-интерфейсе elasticsearch 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"],
Ответ 6
вы также можете сделать это в python, который дает вам правильный список:
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']]
Ответ 7
Разрабатывая ответы на 2 ответа от @Robert-Lujo и @Aleck-Landgraf (кто-то с разрешениями может с радостью переместить это в комментарий): если вы не хотите печатать, но получаете все внутри списка из возвращаемого генератора, вот что я использую:
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]
Ответ 8
Url -> http://localhost:9200/<index>/<type>/_query
http method -> DELETE
Query -> {"query": {"match_all": {}}, "size": 30000, "fields": ["_id"]})