PUT /user/_doc/10001
{
"name": "zhaoshuai-la",
"gender": "male",
"age": 21,
"region": "shandong"
}
PUT /user/_doc/10002
{
"name": "zhaoshuai-lb",
"gender": "male",
"age": 22,
"region": "shandong"
}
PUT /user/_doc/10003
{
"name": "zhaoshuai-lc",
"gender": "male",
"age": 23,
"region": "shandong"
}
PUT /user/_doc/10004
{
"name": "zhaoshuai-ld",
"gender": "fmale",
"age": 24,
"region": "jiangsu"
}
PUT /user/_doc/10005
{
"name": "zhaoshuai-le",
"gender": "fmale",
"age": 25,
"region": "beijing"
}
1 Bucket agregations 分桶聚合
根据属性进行分桶,把具有某些相同属性的数据放到一起,相当于MySQl的group by。
为什么是"field": “tags.keyword”,而不是"field": “tags”?
aggs底层使用的数据结构是正排索引doc_values,而tags的type是text,text在创建的时候是默认不创建正排索引,所以如果tags.keyword直接写成tags则会报错,得指定tags.keyword才可以使用正排索引。
"tags" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
如果一定要对tags本身进行聚合分析怎么办呢,要将tags的fielddata设置为true:
https://blog.csdn.net/weixin_38932035/article/details/106275119
在ES中,text类型的字段使用一种叫做fielddata的查询时内存数据结构。当字段被排序,聚合或者通过脚本访问时这种数据结构会被创建。它是通过从磁盘读取每个段的整个反向索引来构建的,然后存存储在java的堆内存中。
fileddata默认是不开启的。Fielddata可能会消耗大量的堆空间,尤其是在加载高基数文本字段时。一旦fielddata已加载到堆中,它将在该段的生命周期内保留。此外,加载fielddata是一个昂贵的过程,可能会导致用户遇到延迟命中。这就是默认情况下禁用fielddata的原因。如果尝试对文本字段进行排序,聚合或脚本访问,将看到以下异常:
GET /test_index/test_type/_search
{
"aggs": {
"group_by_test_field": {
"terms": {
"field": "test_field"
}
}
}
}
返回:
{
"error": {
"root_cause": [
{
"type": "illegal_argument_exception",
"reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [test_field] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."
}
],
"type": "search_phase_execution_exception",
"reason": "all shards failed",
"phase": "query",
"grouped": true,
"failed_shards": [
{
"shard": 0,
"index": "test_index",
"node": "4onsTYVZTjGvIj9_spWz2w",
"reason": {
"type": "illegal_argument_exception",
"reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [test_field] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."
}
}
],
"caused_by": {
"type": "illegal_argument_exception",
"reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [test_field] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory."
}
},
"status": 400
}
对分词的field,直接执行聚合操作,会报错,大概意思是说,你必须要打开fielddata,然后将正排索引数据加载到内存中,才可以对分词的field执行聚合操作,而且会消耗很大的内存。
这个时候就可以直接使用"field": “tags”:
2 Metrics agregations 指标聚合
根据一些特定的指标进行数据的聚合,比如avg、max、min、sum等。
查询所有指标
按照region去重的数量
3 Pipeline agregations 管道聚合
对聚合的结果再进行聚合,比如统计平均价格最低的商品分类,就得先按分类聚合,再按平均价格聚合,再按价格的高低聚合。
统计平均年龄最小的性别分类
统计不同地区的user的不同性别的数量
按照地区分桶,并输出每个桶的具体age信息
统计不同地区的user、不同性别,各age信息
统计每个商品类型中,不同等级分类商品中,平均价格最低的等级
4 基于查询结果的聚合
管道聚合其实就是基于聚合结果的聚合,那么基于查询结果的聚合其实和管道聚合本质上一样的,先将需要查询的数据查询出来,再将查询的结果进行进一步的聚合运算。
5 基于聚合的查询
绝不是直接将query写在aggs之后就行,即便这么写,也还是基于查询的聚合,本质上并不是基于聚合的查询。
使用post_filter才是基于聚合后的结果进行查询。
其实很多基于聚合的查询,本质上只是做一些简单的过滤,为了方便去看聚合的结果而已。
6 聚合排序
自己试验一下多级聚合:
多层聚合:
7 图形图像聚合函数
histogram 柱状图或直方图
设置:“keyed”: true,可以将区间的落差值作为key使用
设置:“min_doc_count”: 2,只将doc_count>=2的显示出来
date_histogram 柱状图或直方图
interval已经被官方遗弃,建议使用fixed_interval或calendar_interval来进行日期的分类:
fixed_interval支持的粒度有:ms(毫秒)、s(秒)、m(分)、h(小时)、d(天),fixed_interval的灵活度很高,1d就是1天,10d就是10天。
加上extended_bounds条件后,即使是0的数据也会被展示
加上cumulative_sum条件后,可以将聚合的每个阶段的数据进行累计叠加
percentile 百分位统计或饼状图