首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通过IP前缀聚合ElasticSearch中的对象

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

Stack Overflow用户
提问于 2021-02-10 15:22:13
回答 1查看 287关注 0票数 0

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

我试过这样做:

代码语言:javascript
运行
复制
GET flows/_search
{
  "size": 0,
  "aggs": {
    "ip_ranges": {
      "histogram": {
        "field": "ipAddress",
        "interval": 256
      }
    }
  }
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-10 22:10:00

首先,正如建议的这里所建议的那样,最好的方法是:

在索引时对IP地址进行分类,然后使用一个简单的关键字字段来存储类c信息,然后在该字段上使用术语聚合来进行计数。

或者,您可以简单地添加一个多场 关键词映射

代码语言:javascript
运行
复制
PUT myindex
{
  "mappings": {
    "properties": {
      "ipAddress": {
        "type": "ip",
        "fields": {
          "keyword": {         <---
            "type": "keyword"
          }
        }
      }
    }
  }
}

然后在查询时提取前缀(⚠️效率很低!):

代码语言:javascript
运行
复制
GET myindex/_search
{
  "size": 0,
  "aggs": {
    "my_prefixes": {
      "terms": {
        "script": "/\\./.split(doc['ipAddress.keyword'].value)[0]",
        "size": 10
      }
    }
  }
}

作为最后一种选择,您可以预先定义感兴趣的时间间隔,然后使用聚合

代码语言:javascript
运行
复制
{
  "size": 0,
  "aggs": {
    "my_ip_ranges": {
      "ip_range": {
        "field": "ipAddress",
        "ranges": [
          { "to": "192.168.1.1" },
          { "from": "192.168.1.1" }
        ]
      }
    }
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66139783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档