Elasticsearch: получить все сообщения (более 10000) в python3 - PullRequest
0 голосов
/ 18 июня 2019

У меня ElasticSearch 5.2 и я использую python 3.5 для получения сообщений (только не получаю обновлений).У моих критериев поиска общее количество сообщений превышает 10000.

Я исследовал прокрутку, однако затраченное время слишком велико.

from elasticsearch import Elasticsearch
es = Elasticsearch([{'host': 'my-host', 'port': 9200}])
sBody = """
{
   "query": {
         "bool": {
             "must": {
                 "match": {
                         "header.batchId": "batch_id_1"
                }
             }
         }
     }
 }
 """
response = es.search(
      index='index.name',
      body=sBody,
      scroll='2m'
  )

scroll_id = response['_scroll_id']
out = []
while len(response['hits']['hits']):
      response = es.scroll(scroll_id=scroll_id, scroll='2m')
      out += response

print(out)

Всего сообщений в приведенном выше примере ~ 166500.

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

Далее я попытался использоватьasticsearch_dsl

Дополнительный код:

    from elasticsearch_dsl import Search, Q
    from elasticsearch_dsl.query import Match

    qx = Q({'bool': {'must': { 'match' : {'header.batchId' : 'batch_id_1'}}}})
    s = Search(using=es, index="index.name").query(qx)
    response = s.execute()
    print('Total %d hits found.' % response.hits.total)

Приведенный выше код дает правильное общее количество сообщений.

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

Итак, что еще мне нужно сделать, чтобы получить все сообщения?

Есть ли другой способ лучше?

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Если ваши данные довольно большие (скажем, больше, чем просто 10k), вам придется использовать, например.Функция прокруткиЕсли это не так, вы можете использовать только параметры From / Size, но помните, что from + size не может превышать параметр index.max_result_window.Подробнее: От / Размер |ES 7.x

0 голосов
/ 19 июня 2019

Попробуйте передать параметр size в вызов es.search ().

Пожалуйста, прочитайте Документация

size - Количество возвращаемых результатов (по умолчанию:10)

Например: es.search(index=logs_index, body=my_query, size=1000)

es = Elasticsearch([{'host': 'my-host', 'port': 9200}])
doc = {
    'size' : 10000,
    'query': {
        'match_all' : {}
    }
}

res = es.search(index='index.name', body=sBody, scroll='2m')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...