2023-02-06 Elasticsearch 聚合查询相关

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 百分位统计或饼状图

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值