KQL 是什么
KQL(Kibana Query Language)是 Kibana 检索框里的过滤语法,用「字段: 值」配合 and / or / not 组合条件,从 7.11 起成为 Discover 的默认语法。它比 Lucene 查询串更贴近自然表述:布尔关系用英文单词写,字段名不必拼进一个大字符串,语法写错时界面会提示,而不是静默返回空结果。KQL 只负责筛选文档,不改变索引结构与分词方式,检索能否命中最终取决于字段映射是 text 还是 keyword。
基本信息
| 适用平台 | Kibana 7.11 及以上,更早版本需手动切换语法 |
|---|---|
| 使用位置 | Discover、可视化面板、告警规则的查询框 |
| 表达方式 | 字段: 值 + and / or / not,支持通配与数值比较 |
| 与 Lucene 的关系 | 两种语法可切换,KQL 不支持正则表达式 |
典型使用场景
- 排障时按服务与级别收敛日志:service: order-api and level: error
- 排除测试流量干扰:not env: test,让生产视图干净
- 按状态码与耗时定位慢请求:status: 504 and duration_ms >= 1000
- 短语精确检索报错文本:message: "connection refused"
- 跨字段查找关键字:只在关心的一两个字段里搜索,而不是全文扫描
常用表达式
常用表达式
service: order-api # 字段等值:最常用的收敛方式
level: error and not env: test # 布尔组合与取反
status: (500 or 502 or 503) # 括号做同字段多值分组
message: "connection refused" # 引号内按短语整体匹配
path: /v1/* # 通配只用在值的一部分
duration_ms >= 1000 and duration_ms < 5000 # 数值区间比较
exists: trace_id # 判断字段是否存在运算符与语义
| 写法 | 含义 | 注意事项 |
|---|---|---|
| 字段: 值 | 字段等值匹配 | 字段名写错时往往不报错,先核对字段列表 |
| and / or / not | 布尔组合,优先级为 not 高于 and 高于 or | 条件多时用括号明确分组 |
| 值: * | 通配匹配 | 前导通配代价高,尽量少用 |
| >= > < <= | 数值与日期区间比较 | 字段类型需为数值或日期,字符串比较不可靠 |
| 引号包裹 | 短语整体匹配 | 含空格或特殊符号的值必须加引号 |
KQL 由 Kibana 在浏览器端转成 Lucene 查询再发给 Elasticsearch,本身没有独立的服务端语法;同样的条件在 Kibana 之外不适用,脚本化检索要改用 ES DSL。
字段名可以直接从左侧字段列表点选插入,减少手打错字;检索 keyword 子字段时要带后缀,例如 level.keyword: error。