在elasticsearch中es支持对存储文档进行复杂的统计.简称聚合。git
ES中的聚合被分为两大类。github
一、Metrics, Metrics 是简单的对过滤出来的数据集进行avg,max等操做,是一个单一的数值。app
二、ucket, Bucket 你则能够理解为将过滤出来的数据集按条件分红多个小数据集,而后Metrics会分别做用在这些小数据集上。ssh
聚合在ELK里面是一个很是重要的概念,虽然咱们在ELK stack里面用于过多的去了解es的实现过程,可是简单的了解es的查询过程,能够有效的帮助咱们快速的入门Kibana,经过kibana鼠标点击的方式生成聚合数据。curl
一、 git先下载数据导入:elasticsearch
git clone git@github.com:xiaoluoge11/longguo-devops.git学习
执行脚本:this
[root@controller longguo-devops]# ./car.shurl
#备注:咱们会创建一个也许对汽车交易商有所用处的聚合。数据是关于汽车交易的:汽车型号,制造商,销售价格,销售时间以及一些其余的相关数据日志
Bucket:
一、 按时间统计(能够是一个时间区间的柱形图date_histogram:kibana这样展现):
[root@controller .ssh]# curl -XGET '192.168.63.235:9200/cars/transactions/_search?pretty' -d '
{
"aggs" : {
"articles_over_time" : {
"date_histogram" : {
"field" : "sold",
"interval": "month" ##区间能够为:data.hour,munite,year等
}
}
}
}'
返回结果:
"aggregations" : {
"articles_over_time" : {
"buckets" : [
{
"key_as_string" : "2014-01-01T00:00:00.000Z",
"key" : 1388534400000,
"doc_count" : 1
},
{
"key_as_string" : "2014-02-01T00:00:00.000Z",
"key" : 1391212800000,
"doc_count" : 1
},
#####也能够这样指定:
"field" : "sold",
"interval" : "mount",
"format" : "yyyy-MM-dd" ###指定相应的时间格式
"offset": "+6h" ###区间间隔
####或者按照时间区间来查询:
"aggs": {
"range": {
"date_range": {
"field": "date",
"time_zone": "CET",
"ranges": [
{ "to": "2016-02-15/d" },
{ "from": "2016-02-15/d", "to" : "now/d" },
{ "from": "now/d" },
二、 返回价格区间柱形图(Histogram Aggregation):
[root@controller .ssh]# curl -XGET '192.168.63.235:9200/cars/transactions/_search?pretty' -d '
{
"aggs" : {
"prices" : {
"histogram" : {
"field" : "price",
"interval" : 5000
}
}
}
}'
### Histogram作等间距划分,统计区间的price值,看他落在那个区间,数据间隔是5000:
返回结果:
"aggregations" : {
"prices" : {
"buckets" : [
{
"key" : 10000.0,
"doc_count" : 2
},
{
"key" : 15000.0,
"doc_count" : 1
},
三、 查看每种颜色的销量:
[root@controller .ssh]# curl -XGET '192.168.63.235:9200/cars/transactions/_search?pretty' -d '
{
"aggs" : {
"genres" : {
"terms" : { "field" : "color" }
}
}
}'
###注意可能会报以下错:
"reason" : "Fielddata is disabled on text fields by default. Set fielddata=true on [color] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."
提示咱们数据类型不对,咱们修改一下mapping映射:
[root@controller .ssh]# curl -XPUT '192.168.63.235:9200/cars/_mapping/transactions' -d '
> {
> "properties": {
> "color": {
> "type": "text",
> "fielddata": true
> }
> }
> }'
{"acknowledged":true}
再查下就会看到统计分布的结果:
"buckets" : [
{
"key" : "red",
"doc_count" : 4
},
{
"key" : "blue",
"doc_count" : 2
},
{
"key" : "green",
"doc_count" : 2
}
四、 添加一个指标(Metric):
[root@controller .ssh]# curl -XGET '192.168.63.235:9200/cars/transactions/_search?pretty' -d '
{
"aggs" : {
"genres" : {
"terms" : { "field" : "color" }
,
"aggs": {
"avg_price": {
"avg": {
"field": "price"
}
}
}
}
}
}'
####avg能够换成max,min,sum等。用stats就表示全部。
五、 用stats找出Metric的全部值。
curl -XGET '192.168.63.235:9200/cars/transactions/_search?pretty' -d '
{
"aggs" : {
"genres" : {
"terms" : { "field" : "color" }
,
"aggs": {
"avg_price": {
"stats": {
"field": "price"
}
}
}
}
}
}'
####返回结果:
"buckets" : [
{
"key" : "red",
"doc_count" : 4,
"avg_price" : {
"count" : 4,
"min" : 10000.0,
"max" : 80000.0,
"avg" : 32500.0,
"sum" : 130000.0
}
}
本文内容出自:日志分析之 ELK stack 实战 课程学习笔记