2013-07-05 4 views
39

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

+0

Я нашел [это] (https: // github. com/elastic/elasticsearch/issues/17159) очень полезно. – shellbye

ответ

48

Edit: Пожалуйста, прочитайте ответ @Aleck Ландграф, тоже

Вы просто хотите _id поле elasticsearch-внутренний? Или поле id из ваших документов?

Для первых, попробуйте

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

Note 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"] 
} 
' 
+4

Не получится ли это всего 10 результатов? –

+1

Выполнение прямого запроса - не самый эффективный способ сделать это. Когда вы выполняете запрос, он должен отсортировать все результаты перед их возвратом. Прокрутка и сканирование, упомянутые в ответе ниже, будут намного эффективнее, потому что они не сортируют результат, прежде чем возвращать его. – aamiri

+4

Больше не работает в 5.x, поле 'fields' было удалено, вместо этого добавьте' '_source": false' param. –

12

Другой вариант

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

вернется _index, _type, _ id и _score.

+2

-1 Лучше использовать сканирование и прокрутку при доступе к нескольким документам. Это «быстрый способ» сделать это, но не будет работать хорошо, а также может потерпеть неудачу при больших индексах. – PhaedrusTheGreek

+0

В разделе 6.2: «request ... содержит нераспознанный параметр: [fields]» –

1

вы также можете сделать это в 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']] 
30

Лучше использовать scroll and scan, чтобы получить список результатов, так elasticsearch не имеет ранга и сортировки результатов.

С elasticsearch-dsl питона 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 отключает сортировку. Вспомогательная функция scan возвращает генератор питона, который можно безопасно повторить.

+4

Метод 'fields' был удален в версия '5.0.0' (см. https://elasticsearch-dsl.readthedocs.io/en/latest/Changelog.html?highlight=fields(#id2). Теперь вы должны использовать' s = s.source ([]). – illagrenan

+0

данная ссылка недоступна. Отображение 404 –

+0

search_type = проверка устарела с версии 2.1. ([Https://www.elastic.co/guide/en/elasticsearch/reference/2.1/breaking_21_search_changes.html](https: //www.elastic.co/guide/en/elasticsearch/reference/2.1/breaking_21_search_changes.html)) – aleha

2

Вдохновленный @ Aleck-Ландграф ответ, для меня он работал, используя непосредственно scan функцию в стандартной elasticsearch питона 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"], 
0

конкретизируя 2 ответов на @ Robert-Lujo и @ Aleck-Ландграф (кто-то с правами доступа могут с удовольствием переместить это комментарий): , если вы не хотите печатать, но получить все внутри списка из возвращенного генератора, вот что я использую:

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
Url -> http://localhost:9200/<index>/<type>/_query 
http method -> DELETE 
Query -> {"query": {"match_all": {}}, "size": 30000, "fields": ["_id"]}) 
11

Для поиска elasticsearch 5.x вы можете использовать поле «_source».

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

"fields" был устаревшим. (Ошибка: «Поле [поля] больше не поддерживается, используйте [stored_fields] для извлечения сохраненных полей или фильтрации источника, если поле не сохраняется»)

+0

Бонусные баллы за добавление текста ошибки. Сообщения об ошибках Elasticsearch в основном не кажутся очень googlable :( – AmericanUmlaut

Смежные вопросы