文档的聚合分析
像在SQL中会需要SUM(),MAX().AVG()函数。ElasticSearch也提供了关于聚合分析的函数。
ElasticSearch中常见的聚合分析函数有terms(分组函数)、avg(平均数)、range(区间分组)、max(求最大值)、min(求最小值)、cardinality(获取唯一值的数量)、value_count(获取值的数量,不去重,可以得出多少个值参与了聚合)。
语法与举例
语法:
GET /index/type/_search { "aggs": { "自定义聚合名称": { "聚合函数": { 聚合参数 } } } }
举例:
// 按性别分组 GET /douban/book/_search { "aggs": { "groud_by_express": { "terms": { "field": "book_id", "size": 10 } } } } //求年龄的平均数 GET /people/test/_search { "aggs": { "avg_of_age": { "avg": { "field": "age" } } } } // 求年龄的最大值: GET /people/test/_search { "aggs": { "max_of_age": { "max": { "field": "age" } } } } // 把年龄[15,17]的分成一组,把年龄[18,25]的分成一组 GET /people/test/_search { "aggs": { "range_by_age": { "range": { "field": "age", "ranges": [ { "from": 15, "to": 17 }, { "from": 18, "to": 25 } ] } } } } // 获取不同的年龄数:,比如有年龄[1,2,3,3,4,5],得到的结果是5,因为3只算一次 GET /people/test/_search { "aggs": { "get_diff_age_count": { "cardinality": { "field": "age" } } } }
返回结果解析:
其他语法:
先查询后聚合:
GET /people/test/_search { "query": { "match": { "name": "lilei1" } }, "aggs": { "avg_of_age": { "avg": { "field": "age" } } } }
先过滤后聚合:
// 先获取年龄大于15的,再求平均值 GET /people/test/_search { "query": { "range": { "age": { "gt":15 } } }, "aggs": { "avg_of_age": { "avg": { "field": "age" } } } }
聚合函数嵌套
// 先按性别分组,再获取年龄平均值 GET /people/test/_search { "aggs": { "groud_by_express": { "terms": { "field": "gender" }, "aggs": { "avg_of_age": { "avg": { "field": "age" } } } } } }
聚合+排序
// 先按性别分组,再按分组的年龄平均值降序排序,order中的avg_of_age就是下面的聚合函数的自定义名称 GET /people/test/_search { "aggs": { "groud_by_express": { "terms": { "field": "gender", "order": { "avg_of_age": "desc" } }, "aggs": { "avg_of_age": { "avg": { "field": "age" } } } } } }
小结:
本节主要讲了ElasticSearch中关于数据聚合的使用方法,aggs是与query同级的,使用聚合函数需要自己定义一个外层的聚合函数名称,avg用于求平均值,max用于求最大值,range用于范围分组,term用于数据分组。分组可以与条件搜索和过滤一起使用,aggs是与query同级的,聚合函数也可以嵌套使用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)