本文共 5030 字,大约阅读时间需要 16 分钟。
聚合是一种基于搜索的数据汇总技术,通过组合可以完成复杂的数据分析操作。与传统的数据库查询不同,聚合操作更注重数据的汇总和统计,而不是单个文档的检索。通过聚合,我们可以快速获得数据的概览,而不是逐一分析每个文档。
Elasticsearch 的聚合操作分为以下几类,每种类型有其独特的应用场景:
group by,用于将文档分组。例如,根据目的地(DestCountry)进行分组,查看航班数量。Elasticsearch 聚合操作的结构通常如下:
{ "size": 0, // 表示不返回文档,仅用于聚合操作 "aggs": { "聚合名称": { "类型": { "参数": { // 子聚合或其他配置 } } } }} size:通常设置为 0,表示不返回文档,聚合操作仅用于统计。aggs:聚合操作的主体,包含多个聚合。聚合名称:自定义聚合名称,用于区分不同的聚合操作。类型:定义聚合类型,如 terms(分组)、max(最大值)、histogram(时间区间分组)等。为了更好地理解聚合操作,可以使用以下数据集进行测试:
kibana_sample_data_flights导入路径:
Sample flight data。根据目的地国家分组,统计航班数量:
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "dest_count": { "terms": { "field": "DestCountry" } } }} 根据票价区间分组,例如 0-100 元和 100-200 元:
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "price_stat": { "histogram": { "field": "AvgTicketPrice", "interval": 100 } } }} 根据时间戳进行月度分组:
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "price_stat": { "date_histogram": { "field": "timestamp", "calendar_interval": "month" } } }} 统计航班的最大票价和最小票价:
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "max_price": { "max": { "field": "AvgTicketPrice" } }, "min_price": { "min": { "field": "AvgTicketPrice" } } }} 统计每个目的地的最大票价和最小票价:
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "dest_count": { "terms": { "field": "DestCountry" }, "aggs": { "max_price": { "max": { "field": "AvgTicketPrice" } }, "min_price": { "min": { "field": "AvgTicketPrice" } } } } }} 一次性输出多个统计结果:
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_stats": { "stats": { "field": "AvgTicketPrice" } } }} 统计目的地国家的去重数量:
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_cardinality": { "cardinality": { "field": "DestCountry" } } }} 获取每个国家的最小票价,返回最多的两个国家:
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_count": { "terms": { "field": "DestCountry", "size": 5 }, "aggs": { "my_min_price": { "top_hits": { "size": 2, "sort": [ { "AvgTicketPrice": { "order": "asc" } } ] } } } } }} 根据票价范围分组:
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_price_range": { "range": { "field": "AvgTicketPrice", "ranges": [ { "to": 200 }, { "from": 200, "to": 500 }, { "key": ">500", "from": 500 } ] } } }} 查看票价的百分位分布:
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_price_percentiles": { "percentiles": { "field": "AvgTicketPrice", "percents": [1, 5, 25, 50, 75, 95, 99] } } }} 查看目的地的地理边界:
GET kibana_sample_data_flights/_search { "size": 0, "aggs": { "my_geo_bounds": { "geo_bounds": { "field": "DestLocation", "wrap_longitude": true } } }} primary_shard 设置为 1,确保数据集中在单个分片上。shard_size 参数,提高精确度。转载地址:http://jlufz.baihongyu.com/