一:聚合分析简介
对于ES聚合,相当与数据库中的group by 语句,把ES中符合的数据给聚合并返回给客户端。
ES中,聚合语句的查询格式为:
{
"aggs": {
"agg_name": {<!--聚合名称-->
"agg_type": {<!---聚合类型-->
<!--具体聚合body-->
}
}
}
}
二:聚合分析分类
ES当中的聚合分析主要分为指标(metric)聚合和桶(bucketing)聚合。
1.指标聚合
指标聚合(也叫度量聚合),简单点来说就是对数据集中的数据进行相应的指标计算之后,得出聚合结果,如求最大值、最小值、平均值等。
其一般的查询格式为:
{
"size": 0,
"aggs": {
"max_agg": {
"max": {<!--指标关键词-->
"field": "score"<!--按照某个字段进行聚合-->
}
}
}
}
PS:聚合查询中,size可以设置为0,表示不返回ES中的文档,只返回ES聚合之后的数据,提高查询速度,当然如果你需要这些文档的话,也可以按照实际情况进行设置。
指标聚合的分类大致如下:
- max min sum avg
- 文档计数 count
- Value count 统计某字段有值的文档数
- cardinality 值去重计数
- stats 统计 count max min avg sum 5个值
- Extended stats
- Percentiles 占比百分位对应的值统计
- Percentiles rank 统计值小于等于指定值的文档占比
- Geo Bounds aggregation 求文档集中的地理位置坐标点的范围
- Geo Centroid aggregation 求地理位置中心点坐标值
大家具体情况具体使用吧!
2.桶聚合(bucket)
桶聚合,就是把符合聚合条件数据放在一个分组(桶)里面,宁外,桶聚合还将计算落入某个桶里面的文档数量(count)
举个例子:按照某个字段进行聚合,比如color字段有red、yellow、black等,按照颜色进行聚合,查询DSL语句为:
{
"size": 0,
"aggs": {
"term_agg": {
"terms": {<!--指标关键词-->
"field": "color"<!--按照某个字段进行聚合-->
}
}
}
}
返回结果为:
...
{
...
"bucket":[
{"key":"red",
"doc_count":123}
...
]
}
key为聚合的桶的名称,doc_count就是聚合的数量,有一个比较重要的地方,就是在做聚合分析的时候,该字段的mapping需要设置为不可分词的,不然聚合的结果可能不是你想的那样。
聚合操作,还是比较复杂的,有时候要按照嵌套进行聚合才能得出你想要的答案,下面贴出来一些常用的聚合:
- Terms Aggregation 根据字段值项分组聚合
- filter Aggregation 对满足过滤查询的文档进行聚合计算
- Filters Aggregation 多个过滤组聚合计算
- Range Aggregation 范围分组聚合
- Date Range Aggregation 时间范围分组聚合
- Date Histogram Aggregation 时间直方图(柱状)聚合
- Missing Aggregation 缺失值的桶聚合
- Geo Distance Aggregation 地理距离分区聚合
补充一下,还有矩阵聚合,这个可以聚合出条件并集的这种情况(adjacency_matrix),
比如说 A、B、C 想聚合A、B、C、A&B、A&C、B&C就可以用矩阵聚合
三:嵌套聚合
在实际情况中,你可能想把符合某一条件的数据聚合到一个桶里面,然后在这个桶里面进行各项指标的计算,这时候应该怎么做呢?嵌套聚合。
比如下面的DSL语句:
{
"size": 0,
"aggs": {
"term_agg": {
"terms": {<!--指标关键词-->
"field": "color"<!--按照某个字段进行聚合-->
}
},
“aggs”:{
"avg_price"{
"avg":{<!--指标关键词-->
"field":"price"}
}
}
}
}
表示,按照颜色聚合到桶内后,计算每个颜色下的平均价格。
复杂的嵌套查询还有很多,比如说上面的按照平均值聚合后升序排列该怎么做?实际情况也有很多复杂的聚合查询,具体情况具体讨论吧。
这应该算我隔了好几年来第一次写博客吧,写得不好请见谅,自己也在学习上升的阶段,所以也想通过写博客来巩固巩固,不然容易忘记知识,希望自己能坚持下去!