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

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

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

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

22 ответов


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

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

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

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

например:

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)


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

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

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


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

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

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

когда мы делаем сообщение:

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


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

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

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

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


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

  # 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 client

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


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


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


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

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

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


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

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

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


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

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


можно использовать _count API, чтобы получить значение


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

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 под рукой, так как в следующий раз вы 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();

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


Для Elasticsearch 6.x

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

ответ: в хитах - > всего, дайте количество документов

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

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

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

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

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

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

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

адресу http://{хост}:9200/{имяиндекса}/вредоносных процессов?pretty=true & size=(количество записей)

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


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

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

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

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

максимальный результат который возвратит elasticSearch 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" : "" 
}'

никто, кроме @Akira Sendoh ответил, как на самом деле получить все документы. Но даже это решение разбивает мой ES 6.3 сервис без логов. Единственное, что сработало для меня, используя low-level 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 библиотека, которая предлагает более абстрактные, более чистые вызовы, e.g: http://elasticsearch-dsl.readthedocs.io/en/latest/search_dsl.html#hits


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

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

ссылка Elasticsearch в


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

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