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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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. ссылка на эластичные документы (заметили @christophe-roussy)

Ответ 3

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 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 '

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

Ответ 5

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

  # Initialize the scroll
  page = es.search(
  index = 'yourIndex',
  doc_type = 'yourType',
  scroll = '2m',
  search_type = 'scan',
  size = 1000,
  body = {
    # Your query 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

Ответ 6

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

Ответ 7

Если вы хотите извлечь много тысяч записей, тогда... несколько человек дали правильный ответ с помощью 'scroll' (Примечание: некоторые люди также предложили использовать '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 - это не то, что нужно делать вручную. Лучше всего написать код для этого. например, в 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 для извлечения данных.

Ответ 8

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

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

В Elasticsearch v7.2 вы делаете это так:

POST /foo/_search?scroll=1m
{
    "size": 100,
    "query": {
        "match_all": {}
    }
}

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

POST /_search/scroll 
{
    "scroll" : "1m", 
    "scroll_id" : "<YOUR SCROLL ID>" 
}

Ответ 9

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

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

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

Ответ 10

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

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

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

Ответ 11

http://localhost: 9200/foo/_search/? размер= 1000 & красивая = 1

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

Ответ 12

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

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

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

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

Ответ 13

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

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

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

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

Ответ 14

Для Elasticsearch 6.x

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

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

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

Ответ 15

curl -X GET 'localhost:9200/foo/_search?q=*&pretty' 

Ответ 16

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

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

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

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

Ответ 17

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

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

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

Ответ 18

От Kibana DevTools его:

GET my_index_name/_search
{
  "query": {
    "match_all": {}
  }
}

Ответ 19

Максимальный результат, который будет возвращаться с помощью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" : "" 
}'

Ответ 20

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

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

Ответ 21

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

Ответ 22

Никто, кроме @Akira Sendoh не ответил, как на самом деле получить ВСЕ документы. Но даже это решение приводит к сбою моего сервиса ES 6.3 без логов. Единственное, что сработало для меня при использовании низкоуровневой библиотекиasticsearch 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

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

Ответ 23

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

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

Elasticsearch ссылка

Ответ 24

Простое решение с использованием пакета pythonasticsearch-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.

Ответ 25

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

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

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

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

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

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

Ответ 26

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

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