Kibana 与查询语言 — CodeRoadMapKibana:Dev Tools、KQL、Dashboard 与 ES|QL
这一课你将能做到
- 用 Docker 启动 Kibana 并连上 ES,在 Dev Tools Console 里交互式执行 DSL
- 用 KQL 在 Discover 里快速筛题,并说出 KQL 与 Lucene 语法的定位差异
- 用 Lens 拖拽出题库运营看板,并写出第一条 ES|QL 查询
为什么要学
curl 适合脚本和复现,但日常探索数据、调 DSL、做图表,没有人愿意一直在命令行敲转义 JSON。Kibana 是 ES 官方的可视化控制台:自动补全、格式化、历史记录、一键看结果;运营看板(每课程题量、难度分布、更新趋势)拖拽就能做,不需要前端排期。面试中「你们搜索怎么调试、报表怎么做」的答案里,Kibana 是标准组件。
人话:Kibana 就是 ES 的「Navicat + BI 报表」合体。Dev Tools 是开发者的主战场,Discover 是查数据的检索页,Dashboard 是给业务看的大屏,ES|QL 是 8.x 新推出的类 SQL 管道语言,让不习惯 JSON DSL 的人也能查数据。
先建立图像
Kibana 核心界面地图:
Dev Tools → Console 写 DSL,自动补全/复制为 curl,开发者天天用
Discover 选数据视图(data view),KQL 检索,看文档明细
Dashboard 放图表、过滤器,运营看板
Lens 拖拽字段自动推荐图表,最简单的建图方式
Stack Management 数据视图、索引管理、用户角色、告警规则
三种查询语言定位:
| 语言 | 风格 | 场景 |
|---|
| KQL(Kibana Query Language) | 字段:值 + and/or | Discover/过滤器,只用于 Kibana |
| Lucene 语法 | field:value、~ 模糊 | 老版本默认、部分 UI 兼容 |
| Query DSL | JSON | 完整能力,API 和应用代码 |
| ES | QL | FROM... |
| EQL | 事件序列语句 | 安全领域的事件关联(如进程链) |
跟着做
步骤 1:启动 Kibana
docker run -d --name kibana --net es-net -p 5601:5601 \
-e "ELASTICSEARCH_HOSTS=http://es01:9200" \
-e "KIBANA_SYSTEM_PASSWORD=abcd1234" \
docker.elastic.co/kibana/kibana:8.11.0
说明:Kibana 与 es01 在同一 Docker 网络,用容器名访问 ES;我们在 ES 端关了 HTTP SSL,所以 hosts 用 http;KIBANA_SYSTEM_PASSWORD 是内置 kibana_system 服务账号的密码(与 ES 启动时的密码保持一致,8.11 起支持该环境变量自动引导)。浏览器打开 http://localhost:5601,用 elastic / abcd1234 登录。
若启动报服务账号未就绪,可手动执行:
docker exec es01 bin/elasticsearch-reset-password -u kibana_system -i -b
步骤 2:Dev Tools Console 执行 DSL
左侧菜单 → Management → Dev Tools。在 Console 输入:
GET _cluster/health
GET questions/_search
{
"query": {
"bool": {
"must": [{ "match": { "stem": "事务" } }],
"filter": [
{ "term": { "courseId": "C_JAVA" } },
{ "range": { "difficulty": { "gte": 3 } } }
]
}
}
}
光标放在请求里按 Ctrl+Enter 执行;点右上角图标可「Copy as cURL」,也可把之前的 curl「粘贴」进来自动转换成 Console 格式。调试技巧:响应旁直接看每个 hit 的 _score,写新查询时先小 size 验证再固化到代码里。
步骤 3:建数据视图并用 KQL 查题
Stack Management → Data Views → Create data view,名称匹配 questions*,时间字段选 updatedAt。进入 Discover:
# 自由文本:直接输入关键词,跨字段做匹配
事务 失效
# 字段条件
tags: "spring"
# 组合条件:Java 课程、难度 3 以上、已上架
courseId: "C_JAVA" and difficulty >= 3 and published: true
# 短语与通配
lessonTitle: "Spring 事务*"
KQL 特点:只做过滤、不需要写 JSON、支持自动补全字段名和值;and/or/not 组合,引号包短语。注意 KQL 不是 Lucene——它没有 Lucene 的 ~0.5 那套模糊语法(新版部分支持通配),也不能跨出 Kibana 使用。老资料里的 Lucene 查询在 Discover 可通过选项切回,但新项目直接用 KQL。
步骤 4:用 Lens 做运营看板
Analytics → Dashboard → Create → Add visualization → Lens。
- 拖
courseId(keyword)到纵轴,自动生成各课程题目数条形图;
- 再拖
difficulty 到横轴做分布,切换为「堆叠条形」;
- 新建图:拖
updatedAt 到横轴(自动按月聚合)、记录数到纵轴,得到月度更新趋势;
- 新建图:拖
tags 到图例、记录数到纵轴,得到标签占比。
保存到一个 Dashboard,顶部加 Controls(课程下拉、难度滑块),运营点选即可过滤。底层 DSL 可以在图表的 Inspect 面板看到——这也是学聚合的好方法:拖出来再看请求。
步骤 5:写第一条 ES|QL
Dev Tools 里执行(ES|QL 在 8.11 已可用于生产大部分场景):
POST _query?format=txt
{
"query": """
FROM questions
| WHERE courseId == "C_JAVA" AND published == true
| STATS cnt = COUNT(*), avg_diff = AVG(difficulty) BY tags
| SORT cnt DESC
| LIMIT 10
"""
}
管道读法:从 questions 取数 → 过滤 → 按 tags 分组统计数量和平均难度 → 排序 → 取前 10。?format=txt 返回表格文本,开发最直观;应用集成为 JSON 用默认格式。
| EVAL level = CASE(difficulty >= 4, "难", "普通") 派生列
| KEEP stem, tags, difficulty 选列
| DISSECT message "%{ip} %{url}" 拆解字符串
| LOOKUP JOIN courses ON courseId 关联 enrich/索引
ES|QL 适合即席分析和给数据团队使用;应用代码里复杂搜索仍写 Query DSL(控制力最全)。
步骤 6:EQL 一瞥(安全场景)
EQL(Event Query Language)用于事件时序关联,主要在安全日志/威胁狩猎场景:
process where process.name == "cmd.exe" and process.parent.name == "winword.exe"
本站题库用不到 EQL,知道它面向「同一条链上的事件先后关系」、用在 Security 应用即可。
讲清楚要点
- 数据视图(data view)是 Kibana 的入口:它把索引模式(如
questions*)和字段、时间字段绑定,Discover 和 Lens 都基于它;索引名规范(带版本/日期)能让数据视图一次覆盖多索引。
- KQL 只活在 Kibana:别在应用代码里找 KQL API;它是给人在 UI 里快速过滤用的。跨环境的语言是 Query DSL 和 ES|QL。
- ES|QL 与 DSL 不是替代关系:ES|QL 强在管道式分析、学习曲线低;DSL 强在精细控制(打分模型、nested、高亮、向量参数)。两者都执行在同一引擎上。
- Dashboard 加时间和控件才能复用:固定写死条件的图表只服务一次性分析;加上时间筛选、Options 控件后才是运营长期使用的看板。
- 权限跟着 Kibana 走:用户在 Kibana 能看到什么索引、能不能改,都由角色控制;给运营只授 Dashboard/Discover 的只读角色,空间(Spaces)还能隔离不同部门的资产。
你可能会懵的地方
- Kibana 启动后一直 "Kibana server is not ready yet"?
它在等 ES 连接和做资源检查。看 kibana 日志:八成是 hosts 错(协议/容器名)、kibana_system 密码不对、ES 仍在启动。网络不通时这个页面会持续。
- KQL 输入中文关键词为什么好像没按分词走?
Discover 顶层的自由文本框会按数据视图各字段分析器做匹配,中文搜索取决于索引的分词器是否是 IK。先确认索引配置,不要怀疑 KQL。
- Lens 拖字段提示无法聚合?
text 字段不能做 terms 聚合,用它的 keyword 子字段(字段列表里会显示
.keyword);数值字段才能直接出均值/求和。
- ES|QL 报字段找不到?
ES|QL 默认只识别已映射字段,确认字段名大小写和数据视图;嵌套字段、别名在部分小版本支持有限,以 8.11 文档为准。
- Dev Tools 的历史会不会丢?
Console 历史存在浏览器本地,换浏览器/清缓存会没;重要查询导出成
.kibana_history 或直接保存在项目文件里。
错法对照
| 错法 | 问题 | 正解 |
|---|
| 用 KQL 写后端查询 | KQL 无公共 API | Query DSL / ES |
| 不建数据视图直接找索引 | Discover 无法定位数据 | 先建匹配模式的数据视图 |
| Lens 对 text 做分组 | 不支持 | 用 keyword 子字段 |
| 生产看板给全员 elastic 账号 | 权限过大 | 只读角色 + Spaces 隔离 |
| ES | QL 里用单引号写字符串 | 语法为双引号 |
| 只在 Dev Tools 留查询没有沉淀 | 换人即失传 | 固化到代码或文档库 |
卡点急救
- Kibana 连不上 ES:逐项确认网络(同 Docker 网络/容器名解析)、协议(http 与 https 要一致)、kibana_system 密码;日志里
Unable to retrieve version information 基本就是这三类。
- Discover 有数据但显示 0 条:时间选择器默认只看最近 15 分钟,题库 updatedAt 是历史日期——把时间范围放大或选 Show all。
- Dashboard 图表加载慢:时间跨度过大、桶太多;缩短默认时间范围、减少高基数字段 Top N、对重图表改用预聚合索引。
面试常问
-
Kibana 在你们项目里承担什么角色?
三类用途:开发者用 Dev Tools 调试 DSL(可与 curl 互转);运营用 Discover 配 KQL 做数据核查;用 Lens/Dashboard 构建题量、难度、更新趋势看板。它是 ES 的官方可视化层,权限通过角色和 Spaces 管理。
-
KQL 和 Query DSL 是什么关系?
KQL 是 Kibana 内部用于 Discover、过滤器的简化语法(字段:值 + 逻辑组合),不提供公共接口;Query DSL 是完整的 JSON 查询语言,覆盖打分、聚合、嵌套、向量全部能力,应用代码和 API 都用它。ES|QL 则是 8.x 新增的管道式分析语言,定位即席分析。
-
ES|QL 简单说一下。
8.x 推出的管道查询语言,基本形式 FROM 索引 | WHERE | STATS ... BY | SORT | LIMIT,支持 EVAL 派生、DISSECT 拆解、LOOKUP JOIN 关联等,适合探索式分析;底层与 DSL 同一引擎,复杂相关性搜索仍建议用 DSL。
自测三问
- 从「启动 Kibana → 看题 → 做一个图表」要经过哪几个界面和前提配置?
- KQL、Lucene、Query DSL、ES|QL 各自的使用边界在哪里?
- Dashboard 上线给运营长期使用,需要补哪些控件和权限设计?
小结一句话
Kibana 把 ES 的能力交给人和业务:Dev Tools 调查询、Discover+KQL 查数据、Lens 出看板,而 ES|QL 让分析类需求不再必须写 JSON。
延伸