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实现微博关注关系