You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Elasticsearch中按networkId统计1小时内最大并发连接客户端数

如何在Elasticsearch中基于networkId统计1小时内的最大并发连接客户端数

你当前的两个查询都没能实现需求——它们计算的是1小时内各networkId下客户端数的累计总和,而不是你需要的某一时刻的最大并发客户端数(并发数指同一时间点的在线客户端总量)。

正确实现思路

要统计最大并发,核心是先按极小时间间隔分片(比如1分钟,根据你的数据采集频率调整),在每个时间分片内计算对应networkId的瞬时客户端总数,再从所有分片结果中取最大值。

修正后的查询示例

GET /sample_index/_search
{
  "size": 0,
  "query": {
    "bool": {
      "filter": [
        {"range": {"@timestamp": {"gte": "now-1h", "lt": "now"}}}
      ]
    }
  },
  "aggregations": {
    "network_group": {
      "terms": {
        "field": "networkId.keyword",
        "size": 10
      },
      "aggregations": {
        "time_slice": {
          "date_histogram": {
            "field": "@timestamp",
            "fixed_interval": "1m", // 可根据数据上报频率调整,比如5s、30s
            "min_doc_count": 1
          },
          "aggregations": {
            "total_clients": {
              "sum": {
                "script": {
                  "source": "doc['wlan0.clients'].value + doc['wlan1.clients'].value + doc['wlan2.clients'].value + doc['wlan2_6.clients'].value",
                  "lang": "painless"
                }
              }
            }
          }
        },
        "max_concurrent_clients": {
          "max_bucket": {
            "buckets_path": "time_slice>total_clients"
          }
        }
      }
    }
  }
}

查询逻辑说明

  1. 先通过terms聚合按networkId.keyword分组,把同一网络的数据归在一起
  2. 对每个网络,用date_histogram将1小时的时间拆分为多个1分钟的时间分片,确保每个分片内的数据是同一时刻的快照
  3. 在每个时间分片内,用脚本求和所有wlan接口的客户端数,得到该时刻的瞬时客户端总量
  4. 最后用max_bucket聚合,从所有时间分片的瞬时值中提取最大值,这个值就是该networkId在1小时内的最大并发客户端数

你原有查询的问题

  • 第一个查询直接对1小时内的所有文档求和,得到的是累计值,无法反映同一时间点的并发情况
  • 第二个查询虽然增加了bucket_sort,但本质还是对1小时内的所有数据求和后排序,依然是累计统计,没有按时间分片计算瞬时值

内容的提问来源于stack exchange,提问作者KM AMRITA SINGH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 04:46:47