当需要从几十亿条数据分组统计时,关系型数据库因为单点特性显然是有性能瓶颈得。然而针对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"
}
}
}]
}
}
}