当前位置:   article > 正文

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

es索引数据量特别大,怎么读取

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']:
    	# 这里处理具体数据
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
2、更换方式

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

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

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

  "sort": [
    "_doc"
  ]
  • 1
  • 2
  • 3
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']:
        # 处理数据
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
3)处理进度【可选的】

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

progress += 1
print("\r","%.1f"%(progress/total*100),"%","|"*int((progress/total*100)),"=>",total,end="")
  • 1
  • 2
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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/402171
推荐阅读
相关标签
  

闽ICP备14008679号