es實現聚合
es通過
agg
實現聚合,詳情可見 es文檔
有時候查詢es數據的時候可能需要實現多字段group by的功能,例如:
SELECT sum(item_count) from A group by field1, field2, field3
要實現多個維度的聚合,需要嵌套的
agg
查詢語句:
{
"query": {
},
"aggs": {
"field1": {
"terms": {
"field": "field1",
"size": 2147483647 #設置一個大的分桶數,防止一次統計不完整
},
"aggs": {
"field2": {
"terms": {
"field": "field2",
"size": 2147483647
},
"aggs": {
"field3": {
"terms": {
"field": "field3",
"size": 2147483647
},
"aggs": {
"sum_field": {
"sum": {
"field": "sum_field"
}
}
}
}
}
}
}
}
},
"size": 0
}
用函數構建聚合語句的
agg
部分:
def build_query_aggs(fields, sum_field):
agg_data = {}
curr_field = agg_data
for item in fields:
curr_field[item] = {
"terms": {
"field": item,
"size": 2147483647
},
"aggs": {}
}
curr_field = curr_field[item]["aggs"]
curr_field[sum_field] = {
"sum": {
"field": sum_field
}
}
return agg_data
處理得到的數據,將其組織成list:
def build_es_aggs_data(data, fields, sum_field):
curr_field = None
res_data = []
if len(fields) > 0:
curr_field = fields[0]
else:
return
curr_buckets = data[curr_field]['buckets']
for item in curr_buckets:
if len(fields) == 1:
curr_data= {}
curr_data[curr_field] = item['key']
curr_data[sum_field] = item[sum_field]["value"]
res_data.append(curr_data)
else:
pre_data = deepcopy(build_es_aggs_data(item, fields[1:], sum_field))
for pre_item in pre_data:
pre_item[curr_field] = item['key']
res_data.append(pre_item)
return res_data
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
