elasticSearch的分组聚集(group by)
mysql的group by我们都会写,那么elastic的分组聚集呢?要如何写呢?
参考网址:https://blog..net/R_P_J/article/details/78376622
假如我们有一个需要选择的对象,它有两个参数来唯一确定这个对象:vport和vip(一个vip可以对应多个vport), 除此之外,还有feature_type类型,set_info集群信息,cdate日期,feature_data特征值(数字)
我们的目标是选择出一段时间内,某个类型,某个set_info下的每个vip和vport标识对象的平均特征值。所以我们需要: 1.用query来筛选指定的某个类型,某个set_info和某段日期。 2.按照vip进行聚集,然后对vip下的vport进行聚集,并计算平均值:
"avg": {
"field": "feature_data"
}
python代码:
es = Elasticsearch([{host: xxx.12.128.182, port: 9200}])
query = {
"query": {
"bool": {"must": [
{"match": {"feature_type.keyword": feature_type.decode(utf-8)}},
{"match": {"set_info.keyword": set_info}}],
"filter": {
"range": {
"cdate.keyword": {"gt": cdate[0],
"lt": cdate[1]
}
}
}
}
},
"aggs": {
"group_by_vip": {
"terms": {
"field": "vip.keyword"
},
"aggs": {
"group_by_vport": {
"terms": {
"field": "vport","order": { "average_feature_data": "desc" }
}, "aggs": {
"average_feature_data": {
"avg": {
"field": "feature_data"
}
}
}
}
}
}
}
}
print query
vips_max = es.search(index=cdb_vip_feature, body=query, size=num) # 获得vip范围信息
下一篇:
用Redis实现微博关注关系
