Kibana 通过IP前缀聚合ElasticSearch中的对象

kiayqfof  于 2023-09-28  发布在  Kibana
关注(0)|答案(1)|浏览(172)

我有一个ElasticSearch索引,我在其中存储互联网流量对象,每个对象都包含一个IP地址。我希望以一种方式聚合数据,即具有相同IP前缀的所有对象都收集在同一个存储桶中(但不指定特定的前缀)。类似于直方图聚合。这可能吗?
我试过这个:

GET flows/_search
{
  "size": 0,
  "aggs": {
    "ip_ranges": {
      "histogram": {
        "field": "ipAddress",
        "interval": 256
      }
    }
  }
}

但这不起作用,可能是因为ip类型字段不支持直方图聚合。你会怎么做呢?

pzfprimi

pzfprimi1#

首先,正如here所建议的,最好的方法是:
在索引时对IP地址进行分类,然后使用一个简单的关键字字段来存储c类信息,然后在该字段上使用术语聚合来进行计数。
或者,您可以简单地添加multi-fieldkeyword 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" }
        ]
      }
    }
  }
}

相关问题