如何用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 } } } } } }
关键部分解释:
min_doc_count:10在terms聚合:直接过滤掉每日出现次数不足10次的IP,减少后续聚合的计算量。cardinality聚合:专门用来统计字段的唯一值数量,这里就是统计每个IP对应的不同t-pot_hostname的个数。bucket_selector聚合:这是Elasticsearch的桶筛选器,用来在聚合结果中进一步过滤掉不满足条件的IP桶——只有当hostname_count≥3时,该IP才会出现在最终结果里。
执行后,返回的aggregations.ip.buckets里就只有符合两个条件的IP了,每个桶里还会包含hostname_count字段,显示该IP具体关联的hostname数量。
内容的提问来源于stack exchange,提问作者Aurimas
相关产品推荐
相关产品推荐

