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





11 Answers

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

query

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

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

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




В приведенном ниже запросе будет возвращен 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 '

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




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




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

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

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




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

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

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

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



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

Начните с запроса «поиска», но указав параметр «прокрутка» (здесь я использую тайм-аут в 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 для извлечения данных.




Для 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": [
          {



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

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 -X GET 'localhost:9200/foo/_search?q=*&pretty' 



Никто кроме @ Акира Сендох не ответил, как на самом деле получить ВСЕ документы. Но даже это решение приводит к сбою моего сервиса 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




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

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



Related