es的聚合查询(二)

1、es常用的聚合查询有三种

桶聚合

指标聚合

管道聚合

首先我们创建一个product的索引,并插入数据

bash 复制代码
PUT /product
{
  "mappings": {
    "properties": {
      "category": { "type": "keyword" },
      "price": { "type": "float" },
      "timestamp": { "type": "date" }
    }
  }
}


POST /product/_doc/1
{
  "category": "iphone",
  "price": 1200,
  "timestamp": "2024-04-01"
}

POST /product/_doc/2
{
  "category": "Electronics",
  "price": 800,
  "timestamp": "2024-04-10"
}

POST /product/_doc/3
{
  "category": "Clothing",
  "price": 50,
  "timestamp": "2024-04-10"
}

POST /product/_doc/4
{
  "category": "Clothing",
  "price": 30,
  "timestamp": "2024-04-15"
}

POST /product/_doc/5
{
  "category": "Electronics",
  "price": 1500,
  "timestamp": "2024-05-21"
}

2、桶聚合:常用的桶聚合如下

Terms聚合 - 类似SQL的group by,根据字段唯一值分组;

Histogram聚合 - 根据数值间隔分组,例如: 价格按100间隔分组,0、100、200、300等等;

Date histogram聚合 - 根据时间间隔分组,例如:按月、按天、按小时分组;

Range聚合 - 按数值范围分组,例如: 0-150一组,150-200一组,200-500一组;

比如:我想根据category字段唯一值来分组

bash 复制代码
GET /product/_search?size=0
{
  "aggs": {
    "shop": { //聚合查询的名字,随便取个名字
      "terms": { //聚合类型为: terms
        "field": "category"  //要聚合分组的字段
      }
    }
  }
}

以上好比sql为

bash 复制代码
select category, count(*) from product group by category

结果为:

bash 复制代码
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 5,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "shop" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "Clothing", //key是category的各种情况
          "doc_count" : 2 //是每种category的次数
        },
        {
          "key" : "Electronics",
          "doc_count" : 2
        },
        {
          "key" : "iphone",
          "doc_count" : 1
        }
      ]
    }
  }
}

以上这种写法经常用到下拉框列表的聚合分组查询。

2、按照产品类别进行分组,并计算每个类别下的平均价格

bash 复制代码
GET /product/_search
{
  "size": 0,
  "aggs": {
    "category_buckets": {
      "terms": {
        "field": "category"
      },
      "aggs": {
        "avg_price": {
          "avg": {
            "field": "price"
          }
        }
      }
    }
  }
}

结果如下:

bash 复制代码
{
  "took" : 5,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 5,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "category_buckets" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "Clothing",
          "doc_count" : 2,
          "avg_price" : {
            "value" : 40.0
          }
        },
        {
          "key" : "Electronics",
          "doc_count" : 2,
          "avg_price" : {
            "value" : 1150.0
          }
        },
        {
          "key" : "iphone",
          "doc_count" : 1,
          "avg_price" : {
            "value" : 1200.0
          }
        }
      ]
    }
  }
}

3、指标聚合:指标聚合对文档中的数值字段执行统计操作,如求和、平均值、最大值、最小值等

比如:计算所有产品的平均价格。

bash 复制代码
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 5,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "avg_price" : {
      "value" : 716.0
    }
  }
}

比如:计算所有商品的最大价格

bash 复制代码
GET /product/_search
{
  "size": 0,
  "aggs": {
    "avg_price": {
      "max": {
        "field": "price"
      }
    }
  }
}

4、写一个复杂的聚合查询,并配合query查询

比如我想筛出 category = Electronics 和Clothing 的商品,然后在这基础上对category分组,求分组后category的平均值及合计两个字段

bash 复制代码
GET /product/_search
{
  "size": 0, //size=0代表不需要返回query查询结果,仅仅返回aggs统计结果
  "query": { //query查询category=Electronics 和Clothing的数据
    "terms": {
      "category": [
        "Electronics",
        "Clothing"
      ]
    }
  },
  "aggs": { //开始对category字段聚合分组
    "product_category": { //聚合名称
      "terms": {
        "field": "category"
      },
      "aggs": { //聚合名称  
        "avg_price": {
          "avg": { // 指标聚合类型为avg
            "field": "price"
          }
        },
        "sum_price":{ //聚合名称
          "sum": { //指标聚合类型为sum
            "field": "price"
          }
        }
      }
    }
  }
}

结果如下:

bash 复制代码
{
  "took" : 27,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 4,
      "relation" : "eq"
    },
    "max_score" : null,
    "hits" : [ ]
  },
  "aggregations" : {
    "product_category" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "Clothing",
          "doc_count" : 2,
          "avg_price" : {
            "value" : 40.0
          },
          "sum_price" : {
            "value" : 80.0
          }
        },
        {
          "key" : "Electronics",
          "doc_count" : 2,
          "avg_price" : {
            "value" : 1150.0
          },
          "sum_price" : {
            "value" : 2300.0
          }
        }
      ]
    }
  }
}

后续更新管道聚合

相关推荐
risc12345624 分钟前
【Elasticsearch】迁出节点”≠“恢复源节点
大数据·elasticsearch·搜索引擎
乐迪信息24 分钟前
乐迪信息:皮带区域安全值守:AI摄像机杜绝煤矿人员闯入
大数据·运维·人工智能·安全·计算机视觉
渣渣盟25 分钟前
Flink数据流高效写入HBase实战
大数据·flink·scala·apache·hbase
路边草随风40 分钟前
flink实现变更算子checkpoint断点续传依然生效
大数据·人工智能·flink
Web3_Daisy1 小时前
以太坊代币教程:如何添加 Logo 并更新 Token 信息?
大数据·人工智能·web3·区块链·比特币
豆豆1 小时前
国内常用的网站源码及服务商介绍
大数据·cms·网站建设·网站开发·网站模板·网站源码·源码建站
星川皆无恙1 小时前
大数据爬虫可视化分析:基于Python的豆瓣书籍可视化分析系统的设计与实现
大数据·爬虫·python·架构·pycharm·django
汽车仪器仪表相关领域2 小时前
PSN-1:氮气加速 + 空燃比双控仪 ——NOS 系统的 “安全性能双管家”
大数据·linux·服务器·人工智能·功能测试·汽车·可用性测试
lucky_syq2 小时前
深入Spark核心:Shuffle全剖析与实战指南
大数据·分布式·python·spark
paperxie_xiexuo2 小时前
从数据观测到学术断言:面向证据链构建的智能分析工具协同机制研究
大数据·人工智能·机器学习·数据分析