it-roy-ru.com

Запрос Elasticsearch для возврата всех записей

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

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

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

399
John Livermore

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

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

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

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

НАПРИМЕР:

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)

615
Steve Casey
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

116
lfender6445

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/ Это поможет вам лучше понять создаваемые вами индексы, а также протестировать ваши индексы. 

27
Prerak Diwan

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

Типы поиска user и Tweet по всем показателям

19
vjpan8564

Это лучшее решение, которое я нашел с помощью клиента 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

16
Akira Sendoh

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

10
TheEnglishMe

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

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

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

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

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

Тем не менее, передача scroll_id - это не то, что нужно делать вручную. Лучше всего написать код для этого. например в 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 для извлечения данных.

7
Somum

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

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

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

7
Aminah Nuraini

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

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

6
WoodyDRN

http: // localhost: 9200/foo/_search/ ? size = 1000 & pretty = 1

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

5
Edwin Ikechukwu

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

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

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

5
akshay misra

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

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

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

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

размер param увеличивает количество отображаемых обращений со значения по умолчанию (10) до 500.

hTTP: // локальный: 9200/[IndexName]/_search довольно = верно и размер = 500 & Q = *: *

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

hTTP: // локальный: 9200/[имя_индекс]/_search размера = 500 & от 0 =
3
Prasanna Jathan

Для Elasticsearch 6.x

Запрос: GET /foo/_search?pretty=true

Ответ: В Hits-> total укажите количество документов.

    {
      "took": 1,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
      },
      "hits": {
        "total": 1001,
        "max_score": 1,
        "hits": [
          {
3
Anurag

Официальная документация дает ответ на этот вопрос! Вы можете найти это здесь

{
  "query": { "match_all": {} },
  "size": 1
}

Вы просто заменяете size (1) на количество результатов, которое хотите увидеть!

2
christouandr7

От Kibana DevTools его:

GET my_index_name/_search
{
  "query": {
    "match_all": {}
  }
}
1
belostoky
curl -X GET 'localhost:9200/foo/_search?q=*&pretty' 
1
Dhruv Sharma

По умолчанию Elasticsearch возвращает 10 записей, поэтому размер должен быть указан явно.

Добавьте размер с запросом, чтобы получить желаемое количество записей. 

http: // {Host}: 9200/{index_name}/_search? pretty = true & size = (количество записей)

Заметка : Максимальный размер страницы не может быть больше, чем значение индекса index.max_result_window, которое по умолчанию равно 10 000.

1
Satyendra Sharma

Если до сих пор кто-то ищет все данные, которые будут получены от Elasticsearch, как я, для некоторых случаев, вот что я сделал. Более того, все данные означают все индексы и все типы документов. Я использую Elasticsearch 6.3

curl -X GET "localhost:9200/_search?pretty=true" -H 'Content-Type: application/json' -d'
{
    "query": {
        "match_all": {}
    }
}
'

Elasticsearch ссылка

0
Santosh Kumar Arjunan
curl -XGET '{{IP/localhost}}:9200/{{Index name}}/{{type}}/_search?scroll=10m&pretty' -d '{
"query": {
"filtered": {
"query": {
"match_all": {}
}}'
0
aditya

это запрос, чтобы выполнить то, что вы хотите (я предлагаю использовать Kibana, так как это помогает лучше понимать запросы)

GET my_index_name/my_type_name/_search
{
   "query":{
      "match_all":{}
   },
   size : 20,
   from : 3
}

чтобы получить все записи, вы должны использовать запрос "match_all".

размер - это количество записей, которые вы хотите получить (ограничение). по умолчанию ES вернет только 10 записей

от как пропустить, пропустить первые 3 записи.

Если вы хотите извлечь все записи, просто используйте значение из поля "итоги" из результата, как только вы нажмете на этот запрос из Кибаны, и используйте его с "размером".

0
niranjan harpale

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

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,
       ...
0
exceltior

Никто, кроме @Akira Sendoh не ответил, как на самом деле получить ВСЕ документы. Но даже это решение приводит к сбою моей службы ES 6.3 без журналов. Единственное, что сработало для меня при использовании низкоуровневой библиотеки elasticsearch-py, - это помощник сканирования который использует scroll() api:

from elasticsearch.helpers import scan

doc_generator = scan(
    es_obj,
    query={"query": {"match_all": {}}},
    index="my-index",
)

# use the generator to iterate, dont try to make a list or you will get out of RAM
for doc in doc_generator:
    # use it somehow

Тем не менее, более чистый путь в настоящее время, кажется, заключается в использовании библиотеки elasticsearch-dsl, которая предлагает более абстрактные, более чистые вызовы, например: http://elasticsearch-dsl.readthedocs.io/en/latest/search_dsl.html#hits

0
chefarov

Простое решение с использованием пакета python -asticsearch-dsl :

from elasticsearch_dsl import Search
from elasticsearch_dsl import connections

connections.create_connection(hosts=['localhost'])

s = Search(index="foo")
response = s.scan()

count = 0
for hit in response:
    # print(hit.to_dict())  # be careful, it will printout every hit in your index
    count += 1

print(count)

Смотрите также https://elasticsearch-dsl.readthedocs.io/en/latest/api.html#elasticsearch_dsl.Search.scan .

0
asmaier

Максимальный результат, который будет возвращаться с помощьюasticSearch, составляет 10000 при условии размера 

curl -XGET 'localhost:9200/index/type/_search?scroll=1m' -d '
{
   "size":10000,
   "query" : {
   "match_all" : {}
    }
}'

После этого вам нужно использовать Scroll API для получения результата, получить значение _scroll_id и поместить это значение в scroll_id.

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