文档的聚合分析
像在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同级的,聚合函数也可以嵌套使用。