323

У меня есть небольшая база данных в Elasticsearch и для целей тестирования хотелось бы вернуть все записи. Я пытаюсь использовать URL вида ...Запрос Elasticsearch для возврата всех записей

http://localhost:9200/foo/_search?pretty=true&q={'matchAll':{''}} 

Может кто-нибудь дать мне URL вы бы использовать для достижения этой цели, пожалуйста?

ответ

494

Я думаю, что Lucene синтаксис поддерживается так:

http://localhost:9200/foo/_search?pretty=true&q=*:*

по умолчанию размер до 10, так что вам может понадобиться &size=BIGNUMBER, чтобы получить более чем 10 пунктов. (где BIGNUMBER соответствует числу, которое, по вашему мнению, больше, чем вашему набору данных)

BUT, справочная информация elasticsearch suggests для больших наборов результатов, используя тип поиска сканирования.

EG:

curl -XGET 'localhost:9200/foo/_search?search_type=scan&scroll=10m&size=50' -d ' 
{ 
    "query" : { 
     "match_all" : {} 
    } 
}' 

, а затем сохранить запрос в соответствии ссылку документации выше предлагает.

EDIT: scan Устаревший в 2.1.0.

scan не дает никаких преимуществ по сравнению с обычным scroll запросом, отсортированным по _doc. link to elastic docs (разыскан @ Christophe-Русси)

+4

Спасибо. Это был последний, который я придумал, который возвращает то, что мне нужно ... http: // localhost: 9200/foo/_search? Size = 50 & pretty = true & q = *: * –

+1

Добавляя к ответу @ Steve, вы можете найти список параметров, которые elasticsearch понимает в этой ссылке http://www.elasticsearch.org/guide/reference/api/search/uri-request/ –

+0

Возможно ли запустить поиск сканирования с запросом, отличным от запроса match_all? – Churro

14

Запрос ниже будет возвращать NO_OF_RESULTS вы хотели бы быть возвращены ..

curl -XGET 'localhost:9200/foo/_search?size=NO_OF_RESULTS' -d ' 
{ 
"query" : { 
    "match_all" : {} 
    } 
}' 

Теперь вопрос в том, что вы хотите все записи в возвращаться. Поэтому, естественно, перед написанием запроса вы не будете знать значение NO_OF_RESULTS.

Как мы узнаем, сколько записей существует в вашем документе? Просто введите запрос ниже

curl -XGET 'localhost:9200/foo/_search' -d ' 

Это даст вам результат, который выглядит как один ниже

{ 
hits" : { 
    "total" :  2357, 
    "hits" : [ 
    { 
     .................. 

Результат общая говорит вам, сколько записей доступны в документе.Таким образом, это хороший способ узнать значение NO_OF РЕЗУЛЬТАТЫ

curl -XGET 'localhost:9200/_search' -d ' 

Искать все типы во всех индексах

curl -XGET 'localhost:9200/foo/_search' -d ' 

Искать все типы в индексе Foo

curl -XGET 'localhost:9200/foo1,foo2/_search' -d ' 

Поиск все типы в индексах foo1 и foo2

curl -XGET 'localhost:9200/f*/_search 

Поиск всех типов в любых индексах, начиная с й

curl -XGET 'localhost:9200/_all/type1,type2/_search' -d ' 

поиска типов пользователей и чирикать по всем индексам

+8

По умолчанию ES вернет 10 результатов, если в базовый запрос не включен параметр размера. – lfender6445

+0

Предыдущий ответ был три года. Обновил его до текущего. – vjpan8564

96
http://127.0.0.1:9200/foo/_search/?size=1000&pretty=1 
           ^

Обратите внимание на размере пары, что увеличивает хиты, открываемые по умолчанию (10) до 1000 за осколок.

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/search-request-from-size.html

+1

Следует иметь в виду, что (из документов Elasticsearch): обратите внимание, что размер + не может быть больше, чем индекс index.max_result_window, который по умолчанию равен 10 000. – user3078523

10

использование server:9200/_stats также получить статистику о всех ваших псевдонимов .. как размер и количество элементов на псевдоним, это очень полезно и предоставляет полезную информацию

+2

Но, как я помню, ES разрешает получать только 16000 данных за запрос. Поэтому, если данные превышают 16000, этого решения недостаточно. –

20

elasticsearch (ES) поддерживает как GET или запрос POST для получения данных из индекса кластера ES.

Когда мы делаем GET:

http://localhost:9200/[your index name]/_search?size=[no of records you want]&q=*:* 

Когда мы делаем POST:

http://localhost:9200/[your_index_name]/_search 
{ 
    "size": [your value] //default 10 
    "from": [your start index] //default 0 
    "query": 
    { 
    "match_all": {} 
    } 
} 

Я хотел бы предложить использовать плагин UI с elasticsearch http://mobz.github.io/elasticsearch-head/ Это поможет вам получить лучшее чувство индексов, которые вы создаете, а также проверить свои индексы.

4

Elasticsearch получит значительный более медленный, если вы просто добавите какое-то большое количество в качестве размера, один метод, используемый для получения всех документов, использует идентификаторы сканирования и прокрутки.

Таким образом, ваш звонок будет:

GET /foo/_search?search_type=scan&scroll=1m 
{ 
    "query": { "match_all": {}}, 
    "size": 1000 
} 

Это возвращает _scroll_id, который теперь вы можете использовать, чтобы получить первую партию документов.

https://www.elastic.co/guide/en/elasticsearch/guide/current/scan-scroll.html

8

просто! Вы можете использовать параметр size и from!

http://localhost:9200/[your index name]/_search?size=1000&from=0 

то изменить from постепенно, пока не получите все данные.

+1

никогда не используйте этот метод, если данные содержат много документов ... Каждый раз, когда вы переходите на «следующую страницу», Elastic будет медленнее и медленнее! Используйте SearchAfter вместо – Joshlo

2

Некоторые из них дали правильный ответ на использование сканирования и прокрутки, по-видимому, я не мог получить полный ответ, который бы волшебным образом работал.Когда кто-то хочет вытащить записи, вам нужно запустить следующую команду curl.

curl -XGET 'http://ip1:9200/myindex/_search?scroll=1m' -d ' 
{ 
    "query": { 
      "match_all" : {} 
    } 
} 
' 

Но мы не закончили здесь. Выход выше команды завитка будет что-то вроде этого

{"_scroll_id":"c2Nhbjs1OzUyNjE6NU4tU3BrWi1UWkNIWVNBZW43bXV3Zzs1Mzc3OkhUQ0g3VGllU2FhemJVNlM5d2t0alE7NTI2Mjo1Ti1TcGtaLVRaQ0hZU0FlbjdtdXdnOzUzNzg6SFRDSDdUaWVTYWF6YlU2Uzl3a3RqUTs1MjYzOjVOLVNwa1otVFpDSFlTQWVuN211d2c7MTt0b3RhbF9oaXRzOjIyNjAxMzU3Ow==","took":109,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":22601357,"max_score":0.0,"hits":[]}} 

его важно иметь _scroll_id удобно, как на следующий же вы SHD выполните следующую команду

curl -XGET 'localhost:9200/_search/scroll' -d' 
    { 
     "scroll" : "1m", 
     "scroll_id" : "c2Nhbjs2OzM0NDg1ODpzRlBLc0FXNlNyNm5JWUc1" 
    } 
    ' 

Однако, я не думаю, что его легко выполните это вручную. Лучше всего написать код Java, чтобы сделать то же самое.

private TransportClient client = null; 
    private Settings settings = ImmutableSettings.settingsBuilder() 
        .put(CLUSTER_NAME,"cluster-test").build(); 
    private SearchResponse scrollResp = null; 

    this.client = new TransportClient(settings); 
    this.client.addTransportAddress(new InetSocketTransportAddress("ip", port)); 

    QueryBuilder queryBuilder = QueryBuilders.matchAllQuery(); 
    scrollResp = client.prepareSearch(index).setSearchType(SearchType.SCAN) 
       .setScroll(new TimeValue(60000))        
       .setQuery(queryBuilder) 
       .setSize(100).execute().actionGet(); 

    scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()) 
       .setScroll(new TimeValue(timeVal)) 
       .execute() 
       .actionGet(); 

Теперь LOOP в последней команде использует SearchResponse для извлечения данных.

9

Это лучшее решение, которое я нашел с помощью питона клиента

# Initialize the scroll 
    page = es.search(
    index = 'yourIndex', 
    doc_type = 'yourType', 
    scroll = '2m', 
    search_type = 'scan', 
    size = 1000, 
    body = { 
    # Your query's body 
    }) 
    sid = page['_scroll_id'] 
    scroll_size = page['hits']['total'] 

    # Start scrolling 
    while (scroll_size > 0): 
    print "Scrolling..." 
    page = es.scroll(scroll_id = sid, scroll = '2m') 
    # Update the scroll ID 
    sid = page['_scroll_id'] 
    # Get the number of results that we returned in the last scroll 
    scroll_size = len(page['hits']['hits']) 
    print "scroll size: " + str(scroll_size) 
    # Do something with the obtained page 

https://gist.github.com/drorata/146ce50807d16fd4a6aa

Использование клиентского приложения Java

import static org.elasticsearch.index.query.QueryBuilders.*; 

QueryBuilder qb = termQuery("multi", "test"); 

SearchResponse scrollResp = client.prepareSearch(test) 
     .addSort(FieldSortBuilder.DOC_FIELD_NAME, SortOrder.ASC) 
     .setScroll(new TimeValue(60000)) 
     .setQuery(qb) 
     .setSize(100).execute().actionGet(); //100 hits per shard will be returned for each scroll 
//Scroll until no hits are returned 
do { 
    for (SearchHit hit : scrollResp.getHits().getHits()) { 
     //Handle the hit... 
    } 

    scrollResp = client.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(60000)).execute().actionGet(); 
} while(scrollResp.getHits().getHits().length != 0); // Zero hits mark the end of the scroll and the while loop. 

https://www.elastic.co/guide/en/elasticsearch/client/java-api/current/java-search-scrolling.html

5

Лучший способ регулировки размера используется size = numbe г перед URL

Curl -XGET "http://localhost:9200/logstash-*/_search?size=50&pretty" 

Примечание: максимальное значение, которое может быть определено в этом размере 10000. Для любого значения выше десяти тысяч она рассчитывает использовать функцию прокрутки, которая сведет к минимуму любые возможности воздействия на производительность ,

+0

С какой версией происходит максимальный размер? – WoodyDRN

-2

Вы можете использовать размер = 0 это вернет вам все документы пример

curl -XGET 'localhost:9200/index/type/_search' -d ' 
{ 
    size:0, 
    "query" : { 
    "match_all" : {} 
    } 
}' 
+1

Это вернет накопленную информацию, но не сами удары – user732456

+0

извините, я должен сфокусироваться на обман –

4

http://localhost:9200/foo/_search/? размера = 1000 & довольно = 1

вам нужно будет указать параметр размера запроса как по умолчанию 10

+1

он работает спасибо –

+0

приветствую вас @ hamzeh.hanandeh ..... рад, что это помогло кому-то другому –

5

Вы можете использовать _count API, чтобы получить значение для size параметра:

http://localhost:9200/foo/_count?q=<your query> 

Возврат {count:X, ...}. Извлечь значение 'X', а затем сделать фактический запрос:

http://localhost:9200/foo/_search?q=<your query>&size=X 
1

размера паров увеличивают хиты, открываемые от значения по умолчанию (10) до 500.

http://localhost:9200/[indexName]/_search?pretty=true&size=500&q=*:*

Измените из шага шаг за шагом, чтобы получить все данные.

http://localhost:9200/[indexName]/_search?size=500&from=0
0

Чтобы вернуть все записи из всех индексов вы можете сделать:

curl -XGET http://35.195.120.21:9200/_all/_search?size=50&pretty

Выход:

"took" : 866, 
    "timed_out" : false, 
    "_shards" : { 
    "total" : 25, 
    "successful" : 25, 
    "failed" : 0 
    }, 
    "hits" : { 
    "total" : 512034694, 
    "max_score" : 1.0, 
    "hits" : [ { 
     "_index" : "grafana-dash", 
     "_type" : "dashboard", 
     "_id" : "test", 
     "_score" : 1.0, 
     ... 
Смежные вопросы