Цикл по всем результатам запроса с использованиемasticsearch - PullRequest
0 голосов
/ 21 октября 2019

Я работаю с DSL для Elasticsearch в Python. Моя цель - как можно проще работать с данными ответов Elasticsearch в цикле, используя asticsearch-dsl-py .

import datetime
import json
from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search

e_search = Elasticsearch([{'host': 'my-alias', 'port': 5648}])

s = Search(using=e_search, index='sampleindex-2019.10') \
    .filter('range' ,  **{'@timestamp': {'gte': 1571633450000, 'lt': 1571669450000, 'format' : 'epoch_millis'}})

Когда я выполняю это, я получаю следующие значения:

response = s.execute()
print(response.success())
>>> True
print(response.took)
>> 41
print(response.hits.total)
>> 6582

Однако, когда я пытаюсь перебрать все результаты, кажется, что распечатано только 10 попаданий:

for h in response:
    print(hit)
<Hit(sampleindex-2019.10/nQGt7G0BGh3E1MmaFw8e): {'startTime': '2019-10-21T13:57:05.621300916+09:00', 'header...'}>
<Hit(sampleindex-2019.10/egCp7G0BGh3E1Mmaq9bC): {'startTime': '2019-10-21T13:53:15.32923433+09:00', 'headers...'}>
<Hit(sampleindex-2019.10/hACo7G0BGh3E1MmaNsXk): {'headers': {'http_version': 'HTTP/1.1', 'http_user_agent': ...}>
<Hit(sampleindex-2019.10/VgCp7G0BGh3E1Mmae9Tv): {'headers': {'http_version': 'HTTP/1.1', 'http_user_agent': ...}>
<Hit(sampleindex-2019.10/nQGt7G0BGh3E1MmaFw8e): {'startTime': '2019-10-21T13:57:05.621300916+09:00', 'header...'}>
<Hit(sampleindex-2019.10/cwGv7G0BGh3E1Mma1Ddj): {'headers': {'http_version': 'HTTP/1.1', 'http_user_agent': ...}>
<Hit(sampleindex-2019.10/PgGv7G0BGh3E1MmaMzCA): {'startTime': '2019-10-21T13:59:11.83491578+09:00', 'headers...'}>
<Hit(sampleindex-2019.10/4wGw7G0BGh3E1MmaSjzb): {'headers': {'http_version': 'HTTP/1.1', 'http_user_agent': ...}>
<Hit(sampleindex-2019.10/cAGs7G0BGh3E1Mma_Q5Z): {'headers': {'http_version': 'HTTP/1.1', 'http_user_agent': ...}>
<Hit(sampleindex-2019.10/6AGw7G0BGh3E1Mma60OW): {'headers': {'http_version': 'HTTP/1.1', 'http_user_agent': ...}>

Если я хочу работать с этими выходными данными и делать что-то, например, циклически повторять результаты и сохранять информацию в словаре, как я могу достичь этого как можно проще с elasticsearch-dsl-py?

1 Ответ

1 голос
/ 21 октября 2019

Я нашел этот отрывок в документах GitHub (также на Прочитать документы ):

Чтобы указать параметры from / size, используйтеAPI нарезки Python:

s = s[10:20]

Если вы хотите получить доступ ко всем документам, соответствующим вашему запросу, вы можете использовать метод сканирования, использующий API-интерфейс scan / scrollasticsearch:

for hit in s.scan():
    print(hit.title)

Обратите внимание, что в этом случае результаты не будут отсортированы.

...