Запрос Elasticsearch для возврата всех записей - PullRequest
436 голосов
/ 12 января 2012

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

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

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

Ответы [ 26 ]

665 голосов
/ 12 января 2012

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

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

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

НО, документация эластичного поиска предлагает для больших наборов результатов, используя тип поиска сканирования.

EG:

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

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

РЕДАКТИРОВАТЬ: scan устарел в 2.1.0.

scan не обеспечиваетлюбые преимущества по сравнению с обычным запросом scroll, отсортированным по _doc. ссылка на эластичные документы (замечено @ christophe-roussy)

126 голосов
/ 07 апреля 2014
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

31 голосов
/ 29 сентября 2015

asticsearch (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": {}
   }
}   

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

23 голосов
/ 19 марта 2014

Примечание: Ответ относится к более старой версии Elasticsearch 0.90. Версии, выпущенные с тех пор, имеют обновленный синтаксис. Пожалуйста, обратитесь к другим ответам, которые могут дать более точный ответ на последний ответ, который вы ищете.

Приведенный ниже запрос вернет 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 RESULTS

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

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

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

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

17 голосов
/ 10 июня 2016

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

  # 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

11 голосов
/ 18 августа 2014

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

9 голосов
/ 11 февраля 2016

Если вы хотите извлечь много тысяч записей, тогда ... несколько человек дали правильный ответ, используя "прокрутку" (Примечание: некоторые люди также предложили использовать "search_type = scan". Это устарело, и в v5. 0 удалено. Вам это не нужно)

Начните с запроса 'search', но указав параметр 'scroll' (здесь я использую время ожидания в 1 минуту):

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

Сюда входит ваша первая «партия» хитов. Но мы не закончили здесь. Вывод вышеуказанной команды curl будет выглядеть примерно так:

{"_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, так как вы должны выполнить следующую команду:

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

Тем не менее, передача scroll_id не является чем-то, предназначенным для выполнения вручную. Лучше всего написать код для этого. например в яве:

    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 для извлечения данных.

8 голосов
/ 20 ноября 2015

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

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html

7 голосов
/ 14 декабря 2015

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

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

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

6 голосов
/ 10 августа 2016

Лучший способ настроить размер - использовать size = number перед URL-адресом

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

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

...