如何在 Python 中从 Elasticsearch 获取所有结果

新手上路,请多包涵

我是 Elasticsearch 的新手,当我通过我的 Python 脚本运行 Elasticsearch 查询时,我在获取所有结果时遇到了问题。我的目标是查询一个索引(下面的“my_index”),获取这些结果,然后将它们放入 pandas DataFrame 中,该 DataFrame 通过 Django 应用程序并最终以 Word 文档结束。

我的代码是:

 es = Elasticsearch()
logs_index = "my_index"
logs = es.search(index=logs_index,body=my_query)

它告诉我我有 72 次点击,但是当我点击时:

 df = logs['hits']['hits']
len(df)

它说长度只有 10。我看到有人在 这个问题 上有类似的问题,但他们的解决方案对我不起作用。

 from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search
es = Elasticsearch()
logs_index = "my_index"
search = Search(using=es)
total = search.count()
search = search[0:total]
logs = es.search(index=logs_index,body=my_query)
len(logs['hits']['hits'])

len 函数仍然说我只有 10 个结果。我做错了什么,或者我还能做些什么来恢复所有 72 个结果?

ETA:我知道我可以在我的查询中添加 “size”: 10000 以阻止它被截断为 10,但由于用户将输入他们的搜索查询,我需要找到另一种方式,而不仅仅是在搜索查询。

原文由 carousallie 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.2k
2 个回答

您需要将 size 参数传递给您的 es.search() 调用。

请阅读 API 文档

size – 要返回的命中数(默认值:10)

一个例子:

 es.search(index=logs_index, body=my_query, size=1000)

请注意,这不是获取所有索引文档或返回大量文档的查询的最佳方式。为此,您应该执行 scroll 操作,该操作也记录在 scan() 抽象下提供的 API 文档中 scroll 弹性操作。

您还可以在 elasticsearch 文档 中阅读相关信息

原文由 Alexandre Juma 发布,翻译遵循 CC BY-SA 4.0 许可协议

也可以使用 elasticsearch_dsl链接)库:

 from elasticsearch import Elasticsearch
from elasticsearch_dsl import Search
import pandas as pd

client = Elasticsearch()
s = Search(using=client, index="my_index")

df = pd.DataFrame([hit.to_dict() for hit in s.scan()])

这里的秘密是 s.scan() 它处理 分页 并查询整个索引。

请注意,上面的示例将返回整个索引,因为它没有通过任何查询。要使用 elasticsearch_dsl 创建查询,请检查此 链接

原文由 gabra 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题