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



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



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


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

1054   22  

22 ответов:

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

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

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

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

например:

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. ссылка на elastic docs (замечено @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": {}
   }
}   

Я бы предложил использовать плагин пользовательского интерфейса с 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-клиента

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

Так что ваш вызов будет:

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://{host}: 9200 / {index_name} / _search?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 сервис без логов. Единственное, что работало для меня с помощью низкого уровня elasticsearch-py библиотека была через scan helper использует 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

Если все еще кто-то ищет все данные, которые будут извлечены из 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" : {}
    }
}'

Comments

    Ничего не найдено.