elasticSearch的分组聚集(group by)

mysql的group by我们都会写,那么elastic的分组聚集呢?要如何写呢?

参考网址:https://blog.csdn.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范围信息

你可能感兴趣的:(elasticSearch)