如何对表video_traffic_record先分组统计数据(根据domain_name、http_port、time按天分组统计)?再分页显示数据?
时间: 2024-03-08 12:48:41 浏览: 19
可以使用Elasticsearch的聚合功能来实现先分组统计数据的需求,具体步骤如下:
1. 使用terms aggregation进行分组
使用terms aggregation可以对多个字段进行分组,例如对于一个包含视频流量数据的索引,可以使用如下的聚合语句对视频流量按照`domain_name`、`http_port`、`time`按天进行分组:
```
POST /video_traffic_record/_search
{
"size": 0,
"aggs": {
"group_by_domain": {
"terms": {
"field": "domain_name.keyword",
"size": 10
},
"aggs": {
"group_by_port": {
"terms": {
"field": "http_port",
"size": 10
},
"aggs": {
"group_by_day": {
"date_histogram": {
"field": "time",
"calendar_interval": "day"
}
}
}
}
}
}
}
}
```
上述聚合语句将对`video_traffic_record`中的所有文档按照`domain_name`、`http_port`、`time`字段进行分组,并统计各个分组的文档个数。
2. 使用metric aggregation进行统计
在分组的基础上,可以使用metric aggregation进行数据统计。例如,可以使用sum aggregation计算每个分组的流量总量:
```
POST /video_traffic_record/_search
{
"size": 0,
"aggs": {
"group_by_domain": {
"terms": {
"field": "domain_name.keyword",
"size": 10
},
"aggs": {
"group_by_port": {
"terms": {
"field": "http_port",
"size": 10
},
"aggs": {
"group_by_day": {
"date_histogram": {
"field": "time",
"calendar_interval": "day"
},
"aggs": {
"total_traffic": {
"sum": {
"field": "traffic"
}
}
}
}
}
}
}
}
}
}
```
上述聚合语句将对`video_traffic_record`中的所有文档按照`domain_name`、`http_port`、`time`字段进行分组,并计算每个分组的`traffic`字段的总和。
3. 使用from和size参数进行分页
最后,可以使用from和size参数进行分页。例如,如果要显示第11-20条数据,可以将from设置为10,size设置为10:
```
POST /video_traffic_record/_search
{
"from": 10,
"size": 10,
"aggs": {
"group_by_domain": {
"terms": {
"field": "domain_name.keyword",
"size": 10
},
"aggs": {
"group_by_port": {
"terms": {
"field": "http_port",
"size": 10
},
"aggs": {
"group_by_day": {
"date_histogram": {
"field": "time",
"calendar_interval": "day"
},
"aggs": {
"total_traffic": {
"sum": {
"field": "traffic"
}
}
}
}
}
}
}
}
}
}
```
上述聚合语句将对`video_traffic_record`中的所有文档按照`domain_name`、`http_port`、`time`字段进行分组,并计算每个分组的`traffic`字段的总和,最后返回第11-20条数据。