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

如何用ElasticSearch查询每日出现≥10次且关联≥3个t-pot_hostname的IP

解决Elasticsearch筛选IP的需求:每日出现≥10次且关联≥3个不同t-pot_hostname

你的原查询思路方向没错,但核心问题是误将单个hostname的出现次数当成了关联的hostname总数——原查询里的t-pot聚合用min_doc_count:3是要求每个hostname在该IP下至少出现3次,但你需要的是该IP关联的不同hostname的数量≥3。

下面是修正后的查询语句,完美匹配你的需求:

{
  "size": 0,
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "@timestamp": {
              "gte": "now-1d",
              "lt": "now"
            }
          }
        }
      ]
    }
  },
  "aggs": {
    "ip": {
      "terms": {
        "field": "src_ip.keyword",
        "min_doc_count": 10  // 先过滤出每日出现≥10次的IP
      },
      "aggs": {
        "hostname_count": {
          "cardinality": {
            "field": "t-pot_hostname.keyword"  // 统计该IP关联的唯一hostname数量
          }
        },
        "filter_valid_ips": {
          "bucket_selector": {
            "buckets_path": {
              "count": "hostname_count"
            },
            "script": "params.count >= 3"  // 筛选出hostname数量≥3的IP
          }
        }
      }
    }
  }
}

关键部分解释:

  1. min_doc_count:10在terms聚合:直接过滤掉每日出现次数不足10次的IP,减少后续聚合的计算量。
  2. cardinality聚合:专门用来统计字段的唯一值数量,这里就是统计每个IP对应的不同t-pot_hostname的个数。
  3. bucket_selector聚合:这是Elasticsearch的桶筛选器,用来在聚合结果中进一步过滤掉不满足条件的IP桶——只有当hostname_count≥3时,该IP才会出现在最终结果里。

执行后,返回的aggregations.ip.buckets里就只有符合两个条件的IP了,每个桶里还会包含hostname_count字段,显示该IP具体关联的hostname数量。

内容的提问来源于stack exchange,提问作者Aurimas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:10:41