es大量数据读取,超过1w条的那种,该如何操作????这里就是方法(python)

es大批量数据遍历查询方法

1、说明

默认脚本查询,使用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']:
    	# 这里处理具体数据
2、更换方式

使用scroll的方式进行查询,可以避免排序,类似于cursor指针,同样可以实现大量数据的遍历查询:

1)query_json中的数据添加如下的排序方式,

如实查询过程中不再需要对数据进行评分

  "sort": [
    "_doc"
  ]
2)将1中的代码换成如下部分:
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']:
        # 处理数据
3)处理进度【可选的】

在2中的“处理数据”的地方添加如下两行,便于可视化显示:

progress += 1
print("\r","%.1f"%(progress/total*100),"%","|"*int((progress/total*100)),"=>",total,end="")
4)scroll='10s’问题

这里表示时间长度10s,这里要【用户需要】确保每次查询出来的数据在10s内处理完成。如果查询过程出现异常可以适当调小size值。

3、使用scan

使用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)
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧阳小伙

您的打赏是我创作的:最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值