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

如何将第一个KQL查询结果用于第二个查询的过滤?

KQL中用域名列表过滤查询的实现方法

你不需要在KQL里用循环/迭代来实现这个需求,KQL作为面向集合的查询语言,提供了更高效的集合操作函数来完成这类过滤。你的核心问题是原写法中contains操作符只能接收单个字符串,无法直接处理域名列表,这里可以用contains_any()函数来解决。

修正后的完整查询写法

方式一:直接定义域名列表变量

// 提取符合条件的域名列表并转为字符串数组
let hostnames = 
AllDomains 
| where hostname !contains "default.com" and hostname != ""
| distinct hostname
| summarize make_list(hostname);

// 过滤日志事件
let start_date = ago(10m);
let end_date = now();
LogEvents 
| where env_time between (start_date .. end_date)
| where headers contains "X-Forwarded-For"
| where queryString contains_any (hostnames) // 检查queryString是否包含列表中任意域名
| project queryString 

方式二:复用域名查询为函数(适合多次调用场景)

// 定义可复用的域名查询函数
let get_target_hostnames = () {
    AllDomains 
    | where hostname !contains "default.com" and hostname != ""
    | distinct hostname
    | summarize make_list(hostname)
};

// 过滤日志事件
let start_date = ago(10m);
let end_date = now();
LogEvents 
| where env_time between (start_date .. end_date)
| where headers contains "X-Forwarded-For"
| where queryString contains_any (get_target_hostnames())
| project queryString 

关键说明

  • contains_any()是KQL专门用于检查字符串是否包含指定列表中任意元素的函数,比手动循环迭代高效得多
  • 需要用summarize make_list(hostname)将去重后的域名转换为字符串数组,作为contains_any()的参数
  • 原写法中queryString contains (hostnames())的错误在于:contains仅支持单个字符串输入,无法直接处理集合/列表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:05:13