我有一个ElasticSearch索引,其中存储互联网流量对象,每个对象都包含一个IP地址。我希望聚合数据的方式是,所有具有相同IP前缀的对象都收集在同一个桶中(但不指定特定的前缀)。类似于直方图的聚合。这个是可能的吗?
我试过这样做:
GET flows/_search
{
"size": 0,
"aggs": {
"ip_ranges": {
"histogram": {
"field": "ipAddress",
"interval": 256
}
}
}
}但这不起作用,可能是因为ip类型字段不支持直方图聚合。你会怎么做呢?
发布于 2021-02-10 22:10:00
首先,正如建议的这里所建议的那样,最好的方法是:
在索引时对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
}
}
}
}作为最后一种选择,您可以预先定义感兴趣的时间间隔,然后使用聚合
{
"size": 0,
"aggs": {
"my_ip_ranges": {
"ip_range": {
"field": "ipAddress",
"ranges": [
{ "to": "192.168.1.1" },
{ "from": "192.168.1.1" }
]
}
}
}
}https://stackoverflow.com/questions/66139783
复制相似问题