我是使用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,但是由于用户将要输入搜索查询,因此我需要找到另一种方法只是在搜索查询中。
答案 0 :(得分:1)
还可以使用elasticsearch_dsl
(link)库:
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文档中。
答案 2 :(得分:0)
您应该显式设置system("pip install kaggle")
system("kaggle competitions download -c two-sigma-financial-news")
(如果文档数量相对较少),或者使用size
函数来像放置大量文档一样使用光标。