ElasticSearch - Aggregations 聚合分析

本文介绍了ElasticSearch中的聚合功能,包括指标聚合、存储桶聚合和管道聚合。聚合分为指标聚合(如最大、最小、求和、平均值)和存储桶聚合(类似SQL的分组操作),以及管道聚合(对其他聚合的输出做二次处理)。文中详细阐述了各种聚合类型的用法和示例,如直方图、范围聚合、日期直方图、字段值分组桶等,并提及了如何通过buckets_path进行管道聚合操作。
摘要由CSDN通过智能技术生成

一、关于

  •     1、说明

    在 ElasticSearch 中,基于索引和检索的基础上,提供了聚合(Aggregations)的功能,对存储的数据进行统计和分析

    在 ElasticSearch 中,将聚合分为 指标聚合(Metric)、存储桶聚合(Bucket)、管道聚合(Pipeline)三类

    参考:Aggregations | Elasticsearch Guide [8.0] | Elastic

  •     2、语法

    在查询(_search)的请求体中,以 aggregations 为节点,并按如下的语法来定义

{
    "aggregations" : {                                        <!-- 聚合节点,固定的格式,使用 aggregations 或 aggs 命名 -->
        "<aggregation_name>" : {                              <!-- 聚合的名字,自定义,比如 aggs-max 等 -->
            "<aggregation_type>" : {                          <!-- 聚合的类型,例如 avg、range 等 -->
                <aggregation_body>                            <!-- 聚合体:对哪些字段进行聚合 -->
            }
            [,"meta" : {  [<meta_data_body>] } ]?             <!-- 元数据,在结果里原样返回 -->
            [,"aggregations" : { [<sub_aggregation>]+ } ]?    <!-- 在聚合里面再定义的子聚合 -->
        }
        [,"<aggregation_name_2>" : { ... } ]*                 <!-- 其他聚合的名字 -->
    }
}
  •     3、补充

    默认情况下,包含聚合的搜索会同时返回搜索结果和聚合结果。若仅要返回聚合结果,请设置 size 为 0

    默认情况下,操作字段没有值的文档将被忽略,但是也可以为它们定义具体值,通过 missing 参数指定

二、示例

  •     1、指标聚合

        对一个数据集执行类似SQL中的最大(max)、最小(min)、求和(sum)、求平均(avg)等操作的聚合

    基础聚合

{
    "aggs": {
        // 求所有文档的指定字段的平均值
        "aggs_price_avg": {
            "avg": {
                "field": "price"
            }
        }
    }
}

    优化返回

  GET /goods/_search
{
    "aggs": {
        "aggs-avg": {
            "avg": {
                "field": "price",
                // 为没有该值的文档指定默认值
                "missing": 0
            }
        }
    },
    // 不返回搜索结果
    "size": 0
}

    搜索聚合

  GET /goods/_search
{
    "aggs": {
        // 根据指定字段分桶
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的ElasticSearch聚合的Java API示例: ```java import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.Client; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.aggregations.AggregationBuilders; import org.elasticsearch.search.aggregations.bucket.histogram.DateHistogramInterval; import org.elasticsearch.search.aggregations.bucket.histogram.Histogram; import org.elasticsearch.search.aggregations.bucket.terms.Terms; import org.elasticsearch.search.aggregations.metrics.sum.Sum; import org.elasticsearch.search.aggregations.metrics.valuecount.ValueCount; import static org.elasticsearch.index.query.QueryBuilders.rangeQuery; public class ElasticSearchAggregationExample { public static void main(String[] args) { // 创建ElasticSearch客户端 Client client = // ...; // 构建查询条件 QueryBuilder query = QueryBuilders.boolQuery() .must(rangeQuery("timestamp").gte("2022-01-01T00:00:00").lte("2022-01-31T23:59:59")); // 构建聚合条件 AggregationBuilder aggregation = AggregationBuilders .dateHistogram("sales_over_time") .field("timestamp") .dateHistogramInterval(DateHistogramInterval.DAY) .subAggregation( AggregationBuilders .terms("product_types") .field("product_type") .subAggregation( AggregationBuilders.sum("total_sales").field("sales"), AggregationBuilders.count("transaction_count").field("transaction_id") ) ); // 执行查询 SearchResponse response = client.prepareSearch("my_index") .setQuery(query) .addAggregation(aggregation) .execute() .actionGet(); // 解析聚合结果 Histogram histogram = response.getAggregations().get("sales_over_time"); for (Histogram.Bucket bucket : histogram.getBuckets()) { System.out.println("Date: " + bucket.getKeyAsString()); Terms productTypes = bucket.getAggregations().get("product_types"); for (Terms.Bucket productType : productTypes.getBuckets()) { System.out.println("Product Type: " + productType.getKeyAsString()); Sum totalSales = productType.getAggregations().get("total_sales"); System.out.println("Total Sales: " + totalSales.getValue()); ValueCount transactionCount = productType.getAggregations().get("transaction_count"); System.out.println("Transaction Count: " + transactionCount.getValue()); } } // 关闭客户端 client.close(); } } ``` 这个示例通过ElasticSearch的Java API执行了一个聚合,其中包含了两层嵌套聚合,分别按照日期和产品类型对销售数据进行了汇总,输出了每个日期和产品类型的销售总额和交易次数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值