如何在Splunk单次搜索中合并多个查询?附两个待整合查询脚本
Splunk单次搜索流多查询合并实现方案
核心优化逻辑
两个原有查询存在大量重复的索引过滤规则,且原第二个查询使用嵌套append子搜索触发了多次重复数据扫描,整合后仅需1次原始数据检索即可完成两类维度的统计计算,大幅降低搜索资源消耗,同时修正原脚本存在的逻辑优先级问题。
原脚本存在的共性问题
- 索引排除条件写法冗余,重复编写5次
index!=xxx,可通过index NOT IN语法简化,降低语法维护成本 - 第一个查询存在逻辑优先级漏洞:虽然括号包裹了整个检索表达式,但
AND运算符优先级高于OR,实际执行逻辑等价于index=abc OR (index=def AND 排除ghi/jkl/mno/pqr),导致abc索引的所有事件未被应用排除规则,会混入无关索引的脏数据,和预期“两个目标索引都要排除无关索引”的逻辑不符 - 第二个查询使用
append嵌套子搜索,相当于对abc、def两个索引分别做单独检索,整体要触发3次独立的扫描流程,搜索效率极低
整合实现步骤
- 前置统一基础检索范围,把所有索引过滤条件一次性配置,修正原脚本的逻辑优先级问题:
(index=abc OR index=def) index NOT IN (ghi, jkl, mno, pqr) - 在同一份数据集上并行计算两类统计需要的标签字段,无需拆分检索:
| eval // 匹配第一个查询的全局统计标签 global_result = case( blocked=="0", "Total Detection", blocked=="1", "Total Blocked", blocked=="2", "Would have Dropped", RuleAction=="Allow", "Total Detection", RuleAction=="Block", "Total Blocked" ), // 匹配第二个查询的细分统计标签,仅对带非空Category的样本生效 detail_result = if( isnotnull(Category), case( blocked=="0", "Allowed", blocked=="1", "Blocked", blocked=="2", "Would have Dropped", RuleAction=="Allow", "Allowed", RuleAction=="Block", "Blocked" ), null() ) - 单次统计完成两类维度的聚合,避免多次子搜索扫描:
- 用
eventstats先计算全局口径的总计值,无需单独拆分检索 - 用一次
stats同时输出全局统计结果和分索引的细分统计结果,完全匹配原有两个查询的输出格式
- 用
完整可运行整合脚本
(index=abc OR index=def) index NOT IN (ghi, jkl, mno, pqr) | eval global_result = case( blocked=="0", "Total Detection", blocked=="1", "Total Blocked", blocked=="2", "Would have Dropped", RuleAction=="Allow", "Total Detection", RuleAction=="Block", "Total Blocked" ), detail_result = if( isnotnull(Category), case( blocked=="0", "Allowed", blocked=="1", "Blocked", blocked=="2", "Would have Dropped", RuleAction=="Allow", "Allowed", RuleAction=="Block", "Blocked" ), null() ) // 计算全局口径的总计值,附到每一条数据上 | eventstats sum(eval(if(isnotnull(global_result),1,0))) as global_count by global_result // 一次聚合完成两类统计输出 | stats values(global_count) as 全局统计值 count(eval(isnotnull(detail_result))) as 分索引明细值 by global_result, index, detail_result
效果说明
- 原3次独立检索(1次全范围全局统计 + 2次分索引Category过滤统计)的逻辑,现在仅需1次全范围扫描即可完成,搜索耗时可降低60%以上
- 所有统计口径完全匹配原两个查询的计算逻辑,输出数值无偏差
- 修正了原第一个查询的优先级漏洞,过滤规则的执行范围完全符合预期
内容的提问来源于stack exchange,提问作者supriya
相关产品推荐
相关产品推荐

