Подтвердить что ты не робот

Эффективный способ получения всех _ids в ElasticSearch

Каков самый быстрый способ получить все _ID определенного индекса из ElasticSearch? Можно ли использовать простой запрос? Один из моих индексов содержит около 20 000 документов.

4b9b3361

Ответ 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"]})