【Elasticsearch】ip range 聚合
在 Elasticsearch 的 IP 范围聚合中,`mask`参数用于定义 IP 地址范围,它基于 CIDR(无类别域间路由)表示法来指定网络前缀和子网掩码。CIDR 是一种灵活的 IP 地址划分方法,通过指定网络前缀长度来划分网络。
`mask`的作用
在 Elasticsearch 的 IP 范围聚合中,`mask`参数允许你使用 CIDR 表示法来定义 IP 地址范围。例如:
• `10.0.0.0/24`表示网络前缀为`10.0.0.0`,掩码长度为 24 位,覆盖从`10.0.0.0`到`10.0.0.255`的地址范围。
• `10.0.0.128/25`表示网络前缀为`10.0.0.128`,掩码长度为 25 位,覆盖从`10.0.0.128`到`10.0.0.255`的地址范围。
为什么使用`mask`
使用`mask`的主要目的是更高效地管理和统计 IP 地址范围。CIDR 表示法允许灵活地划分网络,避免传统分类方法(A、B、C 类)的浪费。通过定义子网掩码,可以精确地指定需要聚合的 IP 地址范围,从而更准确地统计每个范围内的文档数量。
示例
假设你有一个索引`ip_addresses`,其中存储了用户的 IP 地址信息。你可以使用以下查询来统计特定 CIDR 范围内的 IP 地址数量:
```json
GET /ip_addresses/_search
{
"size": 0,
"aggs": {
"ip_ranges": {
"ip_range": {
"field": "ip",
"ranges": [
{
"mask": "10.0.0.0/24"
},
{
"mask": "10.0.0.128/25"
}
]
}
}
}
}
```
响应示例:
```json
{
"aggregations": {
"ip_ranges": {
"buckets": [
{
"key": "10.0.0.0/24",
"from": "10.0.0.0",
"to": "10.0.0.255",
"doc_count": 100
},
{
"key": "10.0.0.128/25",
"from": "10.0.0.128",
"to": "10.0.0.255",
"doc_count": 50
}
]
}
}
}
```
在这个例子中:
• `10.0.0.0/24`范围内的文档数量为 100。
• `10.0.0.128/25`范围内的文档数量为 50。
通过使用`mask`,你可以灵活地定义 IP 地址范围,并对这些范围进行聚合和统计。