car*_*lie 10 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)
Run Code Online (Sandbox Code Playgroud)
它告诉我我有72次点击,但是当我这样做时:
df = logs['hits']['hits']
len(df)
Run Code Online (Sandbox Code Playgroud)
它说长度只有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'])
Run Code Online (Sandbox Code Playgroud)
len函数仍然说我只有10个结果。我做错了什么,还是可以采取其他措施来恢复全部72个结果?
ETA:我知道我可以在查询中添加“ size”:10000,以防止截断到仅10,但是由于用户将要输入搜索查询,因此我需要找到另一种方式搜索查询。
您需要将size参数传递给您的es.search()呼叫。
请阅读API文档
size –要返回的点击数(默认值:10)
一个例子:
es.search(index=logs_index, body=my_query, size=1000)
Run Code Online (Sandbox Code Playgroud)
请注意,这不是获取所有索引文档或返回大量文档的查询的最佳方法。为此,您应该执行一个scroll操作,该操作也记录在弹性操作的scan()抽象下提供的API文档中scroll。
您也可以在elasticsearch文档中阅读
也可以使用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()])
Run Code Online (Sandbox Code Playgroud)
这里的秘密是s.scan()处理分页和查询整个索引。
请注意,上面的示例将返回整个索引,因为它没有传递任何查询。要创建查询,elasticsearch_dsl请检查此链接。