elasticsearch官方文档学习之第一章:起步 04 简单聚合

博客介绍了Elasticsearch中聚合的功能,它能对数据分组并提取统计信息,类似SQL的GROUP by和聚合函数。还给出多个查询示例,包括按状态分组、计算平均账户余额、对平均余额排序,以及按年龄等级和性别分组计算平均账户余额等。

Aggregations
聚合提供了对数据进行分组和提取统计信息的能力。考虑聚合最简单的方法是大致将其等同于SQL GROUP by和SQL聚合函数。

1)首先,这个示例对所有帐户按照状态进行分组,然后按count降序排列默认返回top10的结果。

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword"
        //"size": 10
      }
    }
  }
}

查询说明:size = 0,我们只关注聚合的结果,不关注具体的文档信息。group_by_state为聚合后的别名可任意命名
等价于sql:SELECT state, COUNT() FROM bank GROUP BY state ORDER BY COUNT() DESC LIMIT 10;

2)在上述示例的基础上,按状态计算平均帐户余额

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword"
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

查询说明:我们将average_balance聚合嵌套在group_by_state聚合中。这是所有聚合的常见模式。可以在聚合中任意嵌套聚合。

3)基于之前的聚合,我们现在按降序对平均余额排序:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_state": {
      "terms": {
        "field": "state.keyword",
        "order": {
          "average_balance": "desc"
        }
      },
      "aggs": {
        "average_balance": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

4)这个例子展示了我们如何按照年龄等级(20-29岁,30-39岁,40-49岁)分组,然后按性别分组,最后得到每个年龄等级,每个性别的平均账户余额:

GET /bank/_search
{
  "size": 0,
  "aggs": {
    "group_by_age": {
      "range": {
        "field": "age",
        "ranges": [
          {
            "from": 20,
            "to": 30
          },
          {
            "from": 30,
            "to": 40
          },
          {
            "from": 40,
            "to": 50
          }
        ]
      },
      "aggs": {
        "group_by_gender": {
          "terms": {
            "field": "gender.keyword"
          },
          "aggs": {
            "average_balance": {
              "avg": {
                "field": "balance"
              }
            }
          }
        }
      }
    }
  }
}
### Elasticsearch 聚合分析基本用法教程 Elasticsearch聚合分析是一种强大的工具,用于从大量数据中提取有意义的信息。它可以分为三种主要类型:指标聚合、桶聚合以及管道聚合。 #### 指标聚合 (Metrics Aggregations) 指标聚合主要用于计算数值型字段的统计数据。常见的指标聚合包括 `max`、`min`、`avg` 和 `sum` 等[^2]。下面是一个简单的例子: ```json GET /sales/_search { "size": 0, "aggs": { "max_price": { "max": { "field": "price" } } } } ``` 此查询会返回 `sales` 索引中价格的最大值[^2]。 #### 桶聚合 (Bucket Aggregations) 桶聚合将数据划分为多个组(称为“桶”),并允许进一步对这些桶内的数据进行分析。常用的桶聚合有 `terms`、`date_histogram` 和 `range` 等[^1]。例如,可以使用 `terms` 聚合来统计每个类别的销售数量: ```json GET /sales/_search { "size": 0, "aggs": { "categories": { "terms": { "field": "category.keyword", "size": 10 } } } } ``` 这段代码会对 `category` 字段的不同取值创建桶,并统计每个类别对应的文档数[^2]。 #### 管道聚合 (Pipeline Aggregations) 管道聚合依赖其他聚合的结果来进行更复杂的运算。例如,通过 `bucket_script` 或者 `derivative` 来实现跨桶间的计算[^4]。以下示例展示了如何找出所有桶中最大值所在的名称及其具体值: ```json GET /sales/_search { "size": 0, "aggs": { "prices_per_category": { "terms": { "field": "category.keyword" }, "aggs": { "average_price": { "avg": { "field": "price" } } } }, "highest_avg_price": { "max_bucket": { "buckets_path": "prices_per_category>average_price" } } } } ``` 这里先按类别分桶再求平均价,最后利用 `max_bucket` 找到最高均价所属分类及对应的价格。 --- ### 注意事项 当涉及基于文本类型的字段做分桶操作时需注意开启 fielddata 参数;而对于嵌套结构则可能需要用到 eager_global_ordinals 提升性能[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值