赞
踩
默认脚本查询,使用from-and-size的方式查询查过一定量是一般大于1万条,就会出现异常。原因是对结果查询、排序、取数据从from位置取出size数量的数据。效率低。
如下查询方式不推荐:
queryResult = es.search(index=indexName,body=query_json)
total = queryResult['hits']['total']
for i in range(0, int(total/100)+1):
query = es.search(index=indexName,body=query_json,size=100,from_=i*100)
for value in query['hits']['hits']:
# 这里处理具体数据
使用scroll的方式进行查询,可以避免排序,类似于cursor指针,同样可以实现大量数据的遍历查询:
如实查询过程中不再需要对数据进行评分
"sort": [
"_doc"
]
firstPage, scrollId, progress = True, "" , 0
while True:
res = es.search(body=queryJson,index=indexName,scroll='10s') if firstPage else es.scroll(scroll_id=scrollId,scroll='10s')
firstPage, scrollId, total = False, res['_scroll_id'], res['hits']['total']
if len(res['hits']['hits'])<=0: break;
for value in res['hits']['hits']:
# 处理数据
在2中的“处理数据”的地方添加如下两行,便于可视化显示:
progress += 1
print("\r","%.1f"%(progress/total*100),"%","|"*int((progress/total*100)),"=>",total,end="")
这里表示时间长度10s,这里要【用户需要】确保每次查询出来的数据在10s内处理完成。如果查询过程出现异常可以适当调小size值。
使用elasticsearch.helpers中的scan实现批量获取数据。其本质是封装了2的实现。对于调用者使用方便了很多。
from elasticsearch import Elasticsearch
from elasticsearch.helpers import scan
es = Elasticsearch(["localhost:9200"])
# 构造查询语句
query = {
"query": {
"match_all": {}
}
}
# 执行scan
for doc in scan(es, query=query, index="my_index", scroll="10s"):
print(doc)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。