本文共 5151 字,大约阅读时间需要 17 分钟。
在数据分析中,Elasticsearch 的聚合功能是处理海量数据的利器。无论是连续型数据(如时间、价格)还是离散型数据(如地点、产品),都可以通过合理的聚合方式,提取出有价值的信息。本文将从基础到高级,逐步讲解如何在 Elasticsearch 中实现不同类型数据的聚合统计。
连续型数据(如价格、时间等)通常需要通过等间隔的方式进行分组。Elasticsearch 提供了 histogram 聚合功能,适用于对连续型数据进行分类统计。
定义聚合类型
在_search 请求中,使用 aggs 参数定义聚合。histogram 聚合需要指定 field(数据字段)和 interval(间隔值)。子聚合
在histogram 之后,可以定义子聚合(subAggregations),用于对每个分组的进一步统计。本例使用 sum 聚合计算每个价格段的销售总额。执行查询
发送聚合请求,获取结果。Elasticsearch 会返回一个包含分组信息的 JSON 对象。POST /cartxns/_search?size=1{ "aggs": { "sales_per_pricerange": { "histogram": { "field": "price", "interval": 20000 }, "aggs": { "total_sales": { "sum": { "field": "price" } } } } }} 执行上述查询后,返回结果中的 buckets 数组包含每个价格段的详细信息,如 doc_count 和 total_sales。以下是示例结果:
{ "aggregations": { "sales_per_pricerange": { "buckets": [ { "key": 0.0, "doc_count": 3, "total_sales": { "value": 37000.0 } }, { "key": 20000.0, "doc_count": 4, "total_sales": { "value": 95000.0 } }, // ... 其他分组结果 ] } }} 离散型数据(如车款名称)通常具有明确的分类属性,适合使用 terms 聚合来进行分组统计。在这种聚合类型下,可以对每个分类(如车款)进行多维度的统计,如平均值、最大值和最小值。
定义聚合类型
使用terms 聚合来定义离散型数据的分组。terms 聚合会根据字段值自动分组。子聚合
在terms 之后,可以定义多个子聚合,分别计算每个分类的平均价格、最大价格和最小价格。执行查询
发送聚合请求,获取结果。Elasticsearch 会返回一个包含分类信息的 JSON 对象。POST /cartxns/_search?size=1{ "aggs": { "avage_price_per_model": { "terms": { "field": "make.keyword" }, "aggs": { "average_price": { "avg": { "field": "price" } }, "max_price": { "max": { "field": "price" } }, "min_price": { "min": { "field": "price" } } } } }} 执行上述查询后,返回结果中的 buckets 数组包含每个车款的详细信息,如 doc_count、平均价格、最大价格和最小价格。以下是示例结果:
{ "aggregations": { "avage_price_per_model": { "buckets": [ { "key": "honda", "doc_count": 3, "max_price": { "value": 20000.0 }, "average_price": { "value": 16666.666666666668 }, "min_price": { "value": 10000.0 } }, { "key": "ford", "doc_count": 2, "max_price": { "value": 30000.0 }, "average_price": { "value": 27500.0 }, "min_price": { "value": 25000.0 } }, // ... 其他车款结果 ] } }} 日期数据是分析时间趋势的重要来源。Elasticsearch 提供了 date_histogram 聚合功能,可以将日期数据按特定间隔(如月、周)进行分组。
定义聚合类型
使用date_histogram 聚合来定义日期分组。date_histogram 需要指定 field(日期字段)、calendar_interval(时间间隔)和 format(日期格式)。执行查询
发送聚合请求,获取结果。Elasticsearch 会返回一个包含日期分组信息的 JSON 对象。POST /cartxns/_search?size=1{ "aggs": { "sales_per_month": { "date_histogram": { "field": "sold", "calendar_interval": "1M", "format": "yyyy-MM-dd" } } }} 执行上述查询后,返回结果中的 buckets 数组包含每个月的详细信息,如 doc_count 和日期值。以下是示例结果:
{ "aggregations": { "sales_per_month": { "buckets": [ { "key_as_string": "2014-01-01", "key": 1388534400000, "doc_count": 1 }, { "key_as_string": "2014-02-01", "key": 1391212800000, "doc_count": 1 }, // ... 其他月份结果 ] } }} 在某些场景中,可能需要对同一数据集执行多种聚合操作。例如,可以先按月份聚合,然后再对每个月份的数据按车款分组,最后计算每个车款的销售总额。
定义主聚合
使用date_histogram 对日期数据进行分组。定义子聚合
在主聚合的基础上,使用terms 聚合对车款进行分组。每个车款分组再使用 sum 聚合计算销售总额。执行查询
发送聚合请求,获取结果。POST /cartxns/_search?size=1{ "aggs": { "sales_per_month": { "date_histogram": { "field": "sold", "calendar_interval": "1M", "format": "yyyy-MM-dd" }, "aggs": { "month_make": { "terms": { "field": "make.keyword", "size": 10 }, "aggs": { "month_total_per_make": { "sum": { "field": "price" } } } }, "monthly_total": { "sum": { "field": "price" } } } } }} 执行上述查询后,返回结果中的 buckets 数组包含每个月份的详细信息。每个月份的信息包括车款分组和销售总额。以下是示例结果:
{ "aggregations": { "sales_per_month": { "buckets": [ { "key_as_string": "2014-01-01", "key": 1388534400000, "doc_count": 1, "month_make": { "doc_count_error_upper_bound": 0, "sum_other_doc_count": 0, "buckets": [ { "key": "bmw", "doc_count": 1, "month_total_per_make": { "value": 80000.0 } } ] }, "monthly_total": { "value": 80000.0 } }, // ... 其他月份结果 ] } }} 通过合理组合不同的聚合类型,可以对数据进行多维度分析。例如,可以按月份分组并按车款分组,最终计算每个车款在每个月的销售总额和平均价格。这种高级聚合方式对于分析时间序列数据中的业务表现尤为有用。
通过以上方法,可以在 Elasticsearch 中高效地处理各种类型的数据,提取出有价值的信息,支持数据驱动的决策和分析需求。
转载地址:http://qzefz.baihongyu.com/