elasticsearch中根据数字类型字段按区间分组聚合计算

本文分享了一个利用Elasticsearch处理大数据分组统计的案例。在30亿条数据中,通过Elasticsearch的聚合查询功能,对长度字段按区间进行分组,并统计各区间的数据条数。进一步,通过嵌套的聚合查询计算了各区间数据的总长度。查询示例展示了如何限定时间范围并获取指定日期内的统计结果。
摘要由CSDN通过智能技术生成

当需要从几十亿条数据分组统计时,关系型数据库因为单点特性显然是有性能瓶颈得。然而针对ES这种天然具备分布式计算特性得存储软件,则变得比较容易。今天分享一个案例:

在ES中我们每天要存储30亿条数据,最近遇到一个需求便是通过数据中的一个数字字段按照区间范围分组统计范围内的数据条数,想起了ES本身支持聚合分组查询,于是写下了如下查询请求:

GET {index}/_search
{
	"aggs": {
		"length_ranges": {
			"range": {
				"field": "length",
				"ranges": [{
						"to": 2000
					},
					{
						"from": 2000,
						"to": 5000
					},
					{
						"from": 5000,
						"to": 8000
					},

					{
						"from": 8000,
						"to": 10000
					},
					{
						"from": 10000
					}
				]
			}
		}
	},
	"query": {
		"bool": {
			"filtter": [{
				"range": {
					"@timestamp": {
						"gte": "2022-01-01T00:00:00.000Z",
						"lte": "2022-01-02T00:00:00.000Z",
						"format": "strict_date_optional_time"
					}
				}
			}]
		}
	}
}

这样以来,即可查询在2022年1月1日当天内,按照长度分0-2000,2000-5000,5000-8000,8000-10000,10000以上等5个区间所统计各自数据条数。

查询出各区间范围内数据条数后,又想查询各区间数据总长度,于是对查询语句进行了修改如下:

GET {index}/_search
{
	"aggs": {
		"length_ranges": {
			"range": {
				"field": "length",
				"ranges": [{
						"to": 2000
					},
					{
						"from": 2000,
						"to": 5000
					},
					{
						"from": 5000,
						"to": 8000
					},

					{
						"from": 8000,
						"to": 10000
					},
					{
						"from": 10000
					}
				]
			},
			"aggs": {
				"length_total": {
					"sum": {
						"field": "length"
					}
				}
			}
		}
	},
	"query": {
		"bool": {
			"filtter": [{
				"range": {
					"@timestamp": {
						"gte": "2022-01-01T00:00:00.000Z",
						"lte": "2022-01-02T00:00:00.000Z",
						"format": "strict_date_optional_time"
					}
				}
			}]
		}
	}
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Elasticsearch聚合器(Aggregations)是用于对搜索结果进行汇总和分析的重要工具。它们允许你在查询结果执行复杂的数据处理,例如计算总和、平均值、分组、过滤等。Elasticsearch提供了多种类型聚合器,以下是其一些主要的: 1. **计数器(Bucket Count)**:最基本的聚合器,用于计算文档数量。 2. **值汇总(Value Sum, Avg, Min, Max)**:计算字段的数值总和、平均值、最小值或最大值。 3. **分桶(Bucketing Aggregators)**: - **分桶聚合器(Bucket Aggregation)**:如术语频率(Term Frequency)、IP范围(IP Range)和日期范围(Date Range)。 - **分组(Grouping)**:如分组桶(Terms, Histogram, Date Histogram)对数据进行分类并计算每个组的结果。 - **子分桶(Sub-Bucketing)**:如nested、geohash_grid等,用于嵌套文档的字段。 4. **最小值/最大值(Min/Max)**:找到指定字段的最小值或最大值。 5. **百分位数(Percentiles)**:计算数值字段的特定百分位数。 6. **卡方检验(Cardinality)**:估算字段值的数量,包括估算不确定性。 7. **直方图(Histogram)**:创建基于时间或数值的区间分布。 8. **地理聚合(Geo Aggregations)**:如geo_centroid、geo_bounds、geohash_grid等,用于地理位置数据。 9. **聚合管道(Pipeline Aggregations)**:允许你串联多个聚合操作以构建更复杂的分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不爱运动的跑者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值