Elasticsearch --- 聚合查询 - Metric (二)

一:聚合查询-Metric

官网: 指标聚合官网文档:Metric

Metric聚合分析分为单值分析和多值分析两类:

#1、单值分析,只输出一个分析结果
min,max,avg,sum,cardinality
#2、多值分析,输出多个分析结果
stats,extended_stats,percentile,percentile_rank,top hits

二:Metric使用

1、Avg(平均值)

计算从聚合文档中提取的数值的平均值。

POST /exams/_search?size=0
{
    "aggs" : {
        "avg_grade" : { "avg" : { "field" : "grade" } }
    }
}

2、Max(最大值)

计算从聚合文档中提取的数值的最大值。

POST /sales/_search?size=0
{
    "aggs" : {
        "max_price" : { "max" : { "field" : "price" } }
    }
}

3、Min(最小值)

计算从聚合文档中提取的数值的最小值。

POST /sales/_search?size=0
{
    "aggs" : {
        "min_price" : { "min" : { "field" : "price" } }
    }
}

4、Sum(总和)

计算从聚合文档中提取的数值的总和。

POST /sales/_search?size=0
{
    "query" : {
        "constant_score" : {
            "filter" : {
                "match" : { "type" : "hat" }
            }
        }
    },
    "aggs" : {
        "hat_prices" : { "sum" : { "field" : "price" } }
    }
}

5、 Cardinality(唯一值)

cardinality 求唯一值,即不重复的字段有多少(相当于mysql中的distinct)

POST /sales/_search?size=0
{
    "aggs" : {
        "type_count" : {
            "cardinality" : {
                "field" : "type"
            }
        }
    }
}

6、Stats

stats 统计,请求后会直接显示多种聚合结果

POST /exams/_search?size=0
{
    "aggs" : {
        "grades_stats" : { "stats" : { "field" : "grade" } }
    }
}

查询结果返回:

{
    ...
    "aggregations": {
        "grades_stats": {
            "count": 2,
            "min": 50.0,
            "max": 100.0,
            "avg": 75.0,
            "sum": 150.0
        }
    }
}

7、Percentiles

对指定字段的值按从小到大累计每个值对应的文档数的占比,返回指定占比比例对应的值。

1)默认取百分比

默认按照[ 1, 5, 25, 50, 75, 95, 99 ]来统计

GET latency/_search
{
    "size": 0,
    "aggs" : {
        "load_time_outlier" : {
            "percentiles" : {
                "field" : "load_time" 
            }
        }
    }
}

返回结果可以理解为:占比为50%的文档的age值 <= 445,或反过来:age<=445的文档数占总命中文档数的50%

{
    ...
   "aggregations": {
      "load_time_outlier": {
         "values" : {
            "1.0": 5.0,
            "5.0": 25.0,
            "25.0": 165.0,
            "50.0": 445.0,
            "75.0": 725.0,
            "95.0": 945.0,
            "99.0": 985.0
         }
      }
   }
}

2)指定分位值

GET latency/_search
{
    "size": 0,
    "aggs" : {
        "load_time_outlier" : {
            "percentiles" : {
                "field" : "load_time",
                "percents" : [95, 99, 99.9] 
            }
        }
    }
}

3)Keyed Response

默认情况下,keyed标志设置为true,它将唯一的字符串键与每个存储桶相关联,并将范围作为哈希而不是数组返回。

GET latency/_search
{
    "size": 0,
    "aggs": {
        "load_time_outlier": {
            "percentiles": {
                "field": "load_time",
                "keyed": false
            }
        }
    }
}

返回结果

{
    ...
    "aggregations": {
        "load_time_outlier": {
            "values": [
                {
                    "key": 1.0,
                    "value": 5.0
                },
                {
                    "key": 5.0,
                    "value": 25.0
                },
                {
                    "key": 25.0,
                    "value": 165.0
                },
                {
                    "key": 50.0,
                    "value": 445.0
                },
                {
                    "key": 75.0,
                    "value": 725.0
                },
                {
                    "key": 95.0,
                    "value": 945.0
                },
                {
                    "key": 99.0,
                    "value": 985.0
                }
            ]
        }
    }
}

8、 Percentile Ranks

上面是通过百分比求文档值,这里通过文档值求百分比。

GET latency/_search
{
    "size": 0,
    "aggs" : {
        "load_time_ranks" : {
            "percentile_ranks" : {
                "field" : "load_time", 
                "values" : [500, 600]
            }
        }
    }
}

返回结果:

{
    ...
   "aggregations": {
      "load_time_ranks": {
         "values" : {
            "500.0": 55.1,
            "600.0": 64.0
         }
      }
   }
}

结果说明:时间小于500的文档占比为55.1%,时间小于600的文档占比为64%。

9、Top Hits

一般用于分桶后获取该桶内匹配前n的文档列表

POST /sales/_search?size=0
{
    "aggs": {
        "top_tags": {
            "terms": {
                "field": "type",  #根据type进行分组 每组显示前3个文档
                "size": 3
            },
            "aggs": {
                "top_sales_hits": {
                    "top_hits": {
                        "sort": [
                            {
                                "date": { 
                                    "order": "desc"  #按照时间进行倒叙排序
                                }
                            }
                        ],
                        "_source": {
                            "includes": [ "date", "price" ] #只显示文档指定字段
                        },
                        "size" : 1
                    }
                }
            }
        }
    }
}

以上例子转载自: 雨点的名字  https://www.cnblogs.com/qdhxhz/p/11556764.html 

三:Metric使用案例 ES6.5.3版本

下面会针对上面转载文档的例子进行举例说明【例子最初来自官方文档,博主细致梳理出来了,咱们就引用了】。

1、添加测试数据

1)创建索引

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Elasticsearch,大数据,Elasticsearch,ES聚合查询,Elasticsearch聚合,ES,Metric,ES聚合查询Metric)