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

时间:2018-12-11 17:54:00

标签: python elasticsearch

我是使用Elasticsearch的新手,在通过Python脚本运行Elasticsearch查询时,我无法将所有结果返回。我的目标是查询索引(以下为“ my_index”),然后将这些结果放入到通过Django应用程序并最终生成Word文档的pandas DataFrame中。

我的代码是:

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

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

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

它的长度只有10。我看到有人在this question上遇到了类似的问题,但是他们的解决方案对我不起作用。

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,但是由于用户将要输入搜索查询,因此我需要找到另一种方法只是在搜索查询中。

3 个答案:

答案 0 :(得分:1)

还可以使用elasticsearch_dsllink)库:

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(),它处理pagination并查询整个索引。

请注意,由于没有传递任何查询,因此上面的示例将返回整个索引。要使用elasticsearch_dsl创建查询,请选中此link

答案 1 :(得分:0)

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

请阅读API Docs

  

size –要返回的点击数(默认值:10)

一个例子:

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

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

您也可以在elasticsearch documentation

中了解它。

答案 2 :(得分:0)

您应该显式设置system("pip install kaggle") system("kaggle competitions download -c two-sigma-financial-news") (如果文档数量相对较少),或者使用size函数来像放置大量文档一样使用光标。

Scan