ES聚合指标

value_count: 计数 cardinality: 去重计数 avg: 平均值 sum: 求和 max: 最大值 min: 最小值 percentiles: 百分比 top_hits: 简单来说就是聚合分组后从每一个组取部分数据作为结果返回

histogram:直方图集合 date_histogram:日期间隔集合

1, 基础数据 用户登陆信息 包含登陆时间、用户ID等信息

查询某个时间段内uv DSL如下:

{ "query": { "bool": { "filter": [ { "range": { "time": { "gte": "2019-09-02 00:00:00", "lt": "2019-09-09 00:00:00", "format": "yyyy-MM-dd HH:mm:ss", "time_zone": "+08:00" } } } ] } }, "aggs": { "userCount": { "cardinality": { "field": "userId.keyword" } } } }

查询某段时间内每天的uv

{ "query": { "bool": { "filter": [ { "range": { "time": { "gte": "2019-09-02 00:00:00", "lt": "2019-09-09 00:00:00", "format": "yyyy-MM-dd HH:mm:ss", "time_zone": "+08:00" } } } ] } }, "aggs": { "groupBy": { "date_histogram": { "field": "time", "interval": "day" //按天 比如按照7天: 7d, 按照月: month等 }, "aggs": { "userCount": { "cardinality": { "field": "userId.keyword" } } } } } }

2, 基础数据 用户访问商品页信息 包含访问时间、访问商品ID、用户ID等信息

统计一个时间范围内 商品访问uv/pv排行

{ "query": { "bool": { "filter": [ { "range": { "time": { "gte": "2019-07-01 00:00:00", "lt": "2019-09-10 00:00:00", "format": "yyyy-MM-dd HH:mm:ss", "time_zone": "+08:00" } } }, { "terms": { "spuId": [ "224441" //特定spu ] } } ], "must_not": { "match": { "userId.keyword": "" } } } }, "aggs": { "groupBy": { "terms": { "field": "spuId.keyword", "order": { "uv": "desc" //按uv排序,此处也可以修改为按pv排序 } }, "aggs": { "uv": { "cardinality": { //uv userId去重后计数 "field": "userId.keyword" } }, "pv": { "value_count": { //pv userId计数 "field": "userId.keyword" } } } } } }

3. date_histogram 函数的使用

interval(时间间隔)的可用表达式:

  • year(1y)年
  • quarter(1q)季度
  • month(1M)月份
  • week(1w)星期
  • day(1d)天
  • hour(1h)小时
  • minute(1m)分钟
  • second(1s)秒
// 查询
"query": {
"bool": {
"must": [{
"range": {
"@timestamp": {
"gte": 1533556800000,
"lte": 1533806520000
}
}
}]
}
},
// 不显示具体的内容
"size": 0,
// 聚合
"aggs": {
// 自己取的聚合名字
"group_by_grabTime": {
// es提供的时间处理函数
"date_histogram": {
// 需要聚合分组的字段名称, 类型需要为date, 格式没有要求
"field": "@timestamp",
// 按什么时间段聚合, 这里是5分钟, 可用的interval在上面给出
"interval": "5m",
// 设置时区, 这样就相当于东八区的时间
"time_zone":"+08:00",
// 返回值格式化,HH大写,不然不能区分上午、下午
"format": "yyyy-MM-dd HH",
// 为空的话则填充0
"min_doc_count": 0,
// 需要填充0的范围
"extended_bounds": {
"min": 1533556800000,
"max": 1533806520000
}
},
// 聚合
"aggs": {
// 自己取的名称
"group_by_status": {
// es提供
"terms": {
// 聚合字段名
"field": "LowStatusOfPrice"
}
}
}
}
}

5. histogram 直方图聚合

直方图聚合是一个用于评估数值型或是数值范围型价值的文档的多桶(multi-bucket)聚合,它可以对参与聚合的值动态生成固定尺寸的桶。比如,如果一些文档具有数值型字段“price”,我们可以配置聚合间隔为5(在价钱中可能为5元)来动态生成直方图统计。当聚合执行的时候,每个文档的price字段会参与估算,并且为四舍五入到最近的桶中。比如,如果一个文档的price字段值为32,桶的尺寸为5,并且字段值四舍五入后的值为30,那么这个文档就会归入跟30这个关键字关联的桶内。下面的算式可以精确的确定每个文档的归属桶(根据桶的关键字确定)。

bucket_key = Math.floor((value - offset) / interval) * interval + offset


注意:interval必须是是一个十进制的正数,同时offset必须是[0,interval)(一个大于等于0、小于interval的十进制数)之间的一个十进制的数。

搜索:

POST /sales/_search?size=0
{
"aggs" : {
"prices" : {
"histogram" : {
"field" : "price",
"interval" : 50
}
}
}
}

结果:

{
...
"aggregations": {
"prices" : {
"buckets": [
{
"key": 0.0,
"doc_count": 1
},
{
"key": 50.0,
"doc_count": 1
},
{
"key": 100.0,
"doc_count": 0
},
{
"key": 150.0,
"doc_count": 2
},
{
"key": 200.0,
"doc_count": 3
}
]
}
}
}