通过 IP 前缀聚合 ElasticSearch 中的对象
Aggregate objects in ElasticSearch by IP Prefix
我有一个 ElasticSearch 索引,用于存储互联网流量对象,每个对象都包含一个 IP 地址。我想以一种方式聚合数据,即所有具有相同 IP 前缀的对象都收集在同一个存储桶中(但不指定特定的前缀)。类似于直方图聚合。这可能吗?
我试过这个:
GET flows/_search
{
"size": 0,
"aggs": {
"ip_ranges": {
"histogram": {
"field": "ipAddress",
"interval": 256
}
}
}
}
但这不起作用,可能是因为 ip 类型字段不支持直方图聚合。你会怎么做?
首先,按照建议 here,最好的方法是:
categorize the IP address at index time and then use a simple keyword field to store the class c information, and then use a term aggregation on that field to do the count.
或者,您可以简单地添加 multi-field keyword mapping:
PUT myindex
{
"mappings": {
"properties": {
"ipAddress": {
"type": "ip",
"fields": {
"keyword": { <---
"type": "keyword"
}
}
}
}
}
}
然后在查询时提取前缀(⚠️效率极低!):
GET myindex/_search
{
"size": 0,
"aggs": {
"my_prefixes": {
"terms": {
"script": "/\./.split(doc['ipAddress.keyword'].value)[0]",
"size": 10
}
}
}
}
作为最后一个选项,您可以提前定义感兴趣的区间并使用 ip_range
aggregation:
{
"size": 0,
"aggs": {
"my_ip_ranges": {
"ip_range": {
"field": "ipAddress",
"ranges": [
{ "to": "192.168.1.1" },
{ "from": "192.168.1.1" }
]
}
}
}
}
我有一个 ElasticSearch 索引,用于存储互联网流量对象,每个对象都包含一个 IP 地址。我想以一种方式聚合数据,即所有具有相同 IP 前缀的对象都收集在同一个存储桶中(但不指定特定的前缀)。类似于直方图聚合。这可能吗?
我试过这个:
GET flows/_search
{
"size": 0,
"aggs": {
"ip_ranges": {
"histogram": {
"field": "ipAddress",
"interval": 256
}
}
}
}
但这不起作用,可能是因为 ip 类型字段不支持直方图聚合。你会怎么做?
首先,按照建议 here,最好的方法是:
categorize the IP address at index time and then use a simple keyword field to store the class c information, and then use a term aggregation on that field to do the count.
或者,您可以简单地添加 multi-field keyword mapping:
PUT myindex
{
"mappings": {
"properties": {
"ipAddress": {
"type": "ip",
"fields": {
"keyword": { <---
"type": "keyword"
}
}
}
}
}
}
然后在查询时提取前缀(⚠️效率极低!):
GET myindex/_search
{
"size": 0,
"aggs": {
"my_prefixes": {
"terms": {
"script": "/\./.split(doc['ipAddress.keyword'].value)[0]",
"size": 10
}
}
}
}
作为最后一个选项,您可以提前定义感兴趣的区间并使用 ip_range
aggregation:
{
"size": 0,
"aggs": {
"my_ip_ranges": {
"ip_range": {
"field": "ipAddress",
"ranges": [
{ "to": "192.168.1.1" },
{ "from": "192.168.1.1" }
]
}
}
}
}