elasticsearch - 通过 IP 前缀聚合 ElasticSearch 中的对象
问题描述
我有一个 ElasticSearch 索引,用于存储互联网流量对象,每个对象都包含一个 IP 地址。我想以一种将具有相同 IP 前缀的所有对象收集在同一个存储桶中的方式聚合数据(但不指定特定的前缀)。类似于直方图聚合的东西。这可能吗?
我试过这个:
GET flows/_search
{
"size": 0,
"aggs": {
"ip_ranges": {
"histogram": {
"field": "ipAddress",
"interval": 256
}
}
}
}
但这不起作用,可能是因为 ip 类型字段不支持直方图聚合。你会怎么做呢?
解决方案
首先,正如这里所建议的,最好的方法是:
在索引时对 IP 地址进行分类,然后使用简单的关键字字段来存储 c 类信息,然后在该字段上使用术语聚合来进行计数。
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
聚合:
{
"size": 0,
"aggs": {
"my_ip_ranges": {
"ip_range": {
"field": "ipAddress",
"ranges": [
{ "to": "192.168.1.1" },
{ "from": "192.168.1.1" }
]
}
}
}
}
推荐阅读
- javascript - 将值和键从一个数组复制到另一个数组
- ruby-on-rails - 在“tmp:clear”之后运行任务
- python - 安装 dabl 包
- c++ - clang++ 总是生成空的 proraw 覆盖率报告
- jquery - Bootstrap 4 - 进度条进度
- php - 我如何强制下载 doc 文件我的项目要求是何时单击按钮强制下载 doc 文件
- ios - Swift CoreStore 订单列表监控问题
- javascript - 单击按钮时矩形元素不会转换到数据点
- c# - 我无法使用 SSL(TLS) 作为来自 C# 的 kafka 生产者发布 JSON 消息
- reactjs - 如何在 react-google-maps 库的 map 函数中从父组件传递数据或使用 axios?