python做es的聚合统计和分页读取

通过python实现对es数据的聚合统计最后将数值写入excel文件

#!/usr/bin/python3
#-*- coding: utf-8 -*-

from elasticsearch import Elasticsearch
from openpyxl import load_workbook

es = Elasticsearch(hosts=http://localhost, port=9200, http_auth=(admin, admin), timeout=60)
#es聚合查询数据
para = {
   "aggs": {
      "date": {
        "date_histogram": {
          "field" : "timestamp",
          "interval" : "month",
          "format" : "yyyy-MM-dd"
      },
      "aggs": {
        "ip":{
          "terms": {
            "field": "ip",
            "size":0
          },
          "aggs": {
          "aborad":{
            "terms": {
              "field": "geoip.country_code",
              "size":0
          }
      }
    }
}
}
}
}
}
###分页读取数据
queryData = es.search(index="risk_threaten*", doc_type="doc",scroll =2m, body=para,size =100)
data = queryData[aggregations][date][buckets]
print(data)
sid = queryData[_scroll_id]
scroll_size = queryData[hits][total]
###时间列表
date_list = []
ip_list = []
queryData = es.scroll(scroll_id=sid, scroll=2m)
#Update the scroll ID
sid = queryData[_scroll_id]
scroll_size = queryData[hits][total]
wt = load_workbook("D:\python\es_risk\threaten_month.xlsx")
sheet = wt.active
#sheet.cell(row=1, column=1, value="datetime")
#sheet.cell(row=1, column=2, value="")##读取数据
sheet.cell(row=1, column=5, value="ip_abroad_total")
row = 1
for ip_data in data:
    date = ip_data[key_as_string]
    print(date)
    total = ip_data[doc_count]
    row += 1
    ip_list=[]
    # sheet.cell(row=row, column=1, value=date); ###ip后面跟着城市
    for list_ip in ip_data[ip][buckets]:
        dst_ip =list_ip[key]
        abroad = list_ip[aborad]
        for region in abroad[buckets]:
            if region[key] != CN:
                ip_list.append(dst_ip)

    s = 0
    for ip in ip_list:
        s+=1
    print(s)
    sheet.cell(row=row, column=5, value=s);
    print(ip_list)
##保存文件
wt.save("D:\python\es_risk\threaten_month.xlsx")
经验分享 程序员 微信小程序 职场和发展