聚合
可用的聚合
度量聚合
- max、min、sum、avg(用在数值型字段):下面是对字段year求最小值
{
"aggs":{
"agg_name":{
"min":{
"field":"year"
}
}
}
}
- 使用脚本
{
"aggs":{
"agg_name":{
"min":{
"field":"year",
"script":"_value - mod",
"params":{
"mod":100
}
}
}
}
}
- value_count聚合:统计字段有的所有标记,即该字段不为空的记录数量。有的分析字段在内部被分词,该聚合是统计原始未经分析的版本。
{
"aggs":{
"agg_name":{
"value_count":{
"field":"year"
}
}
}
}
- stat和extended_stat聚合:stat聚合统计数值型字段的统计信息包括:最大,最小,平均,总量,总和。extended_stat在stat统计信息的基础上,添加了平方和,方差和标准差。
桶聚合
桶聚合返回很多子集,并限制输入数据到一个特殊的叫做桶的子集中。
- terms聚合:为字段每个词条返回一个桶。还可以定义的属性包括:size(返回多少个桶),order(_term表示key,_count表示doc_count)。下面对copy字段统计
{
"aggs":{
"agg_name":{
"terms":{
"field":"copy",
"size":20,
"order":{"_term":"desc"}
}
}
}
}
返回多个桶,下面是返回了一个桶
{
"agg_name":{
"buckets":{
"key":4,
"doc_count":2
}
}
}
- range聚合:使用定义的范围来创建桶。下面的例子检查给定时间区间的数据
{
"aggs":{
"year":{
"range":{
"field":"year",
"keyed":true,
"range":[
{"key":"A","to":1850 },
{"key":"B","from":1851, "to":1900 },
{"key":"C","from":1901, "to":1950 },
{"key":"D","from":2001 }
]
}
}
}
}
上边的keyed属性可以没有,加上后,es会为结果添加标签(名称),使结果会更清晰明了,如果不想使用es自动创建的标签,加入key属性,添加自己的标签。
- date_range聚合:类似range聚合,只不过使用的字段必须是日期类型。如果统计一个随时间变化的聚合时,可以使用
now-3d
这样的表达式,表示从现在起往前三天。 - nested聚合
- histogram聚合
{
"aggs":{
"year":{
"histogram":{
"field":"year",
"interval":100
}
}
}
}
interval定义了每个桶的范围长度,上例的意思桶将以100年为周期进行创建。其他还有min_doc_count属性。
6. 时区:Elasticsearch将日期存储成UTC时区,有三个属性可以设置:pre_zone, post_zone, time_zone。使用方式可以看Kibana请求
7. geo_distance:
8. geohash_grid
聚合的嵌套
执行顺序是先执行父嵌套,再执行子嵌套
桶排序和嵌套聚合
Elasticsearch还可以使用嵌套聚合里的值