【问题标题】:Loop over all results from query using elasticsearch使用 elasticsearch 遍历查询的所有结果
【发布时间】:2019-10-21 16:03:49
【问题描述】:

我正在使用 Python 中的 Elasticsearch DSL。我的目标是使用elasticsearch-dsl-py 尽可能轻松地循环处理 Elasticsearch 响应数据。

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 尽可能轻松地实现?

【问题讨论】:

    标签: python elasticsearch elasticsearch-dsl elasticsearch-dsl-py


    【解决方案1】:

    我在GitHub docs(也在Read The Docs)找到了这段摘录:

    要指定 from/size 参数,请使用 Python 切片 API:

    s = s[10:20]
    

    如果您想访问与您的查询匹配的所有文档,您可以使用使用 scan/scroll elasticsearch API 的 scan 方法:

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

    请注意,在这种情况下,结果不会被排序。

    【讨论】:

      猜你喜欢
      • 2015-12-16
      • 2015-02-09
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      • 1970-01-01
      • 2015-05-09
      • 2014-05-31
      相关资源
      最近更新 更多