作者:来自 Elastic Tyler Perkins

使用 ES|QL 视图,你只需要一个查询即可支持多个仪表板。定义一次,让 Elasticsearch 自动保持一切同步。
动手体验 Elasticsearch:深入了解 Elasticsearch Labs 仓库中的示例 notebooks,开始免费的云试用,或者现在就在本地机器上尝试 Elastic。
Elasticsearch Query Language( ES|QL )现在支持逻辑视图。定义一次查询,并像索引一样在 FROM 中通过名称引用。十二个仪表板,一个定义,零复制粘贴。更新视图,所有使用方都会自动获得更新。
视图不会存储数据;它们在每次读取时都会重新执行,因此结果始终反映当前数据和当前定义。如果你使用过 SQL 数据库中的视图,这会让你感到熟悉。不同之处在于: ES|QL 视图是存储在 Elasticsearch 集群级别的引擎级虚拟索引,而不是在客户端展开的已保存查询文本。它们会出现在 Kibana 自动补全中,支持跨集群搜索(cross-cluster search - CCS ),并由专用的基于角色的访问控制( RBAC )权限进行管理。
一个简单视图
视图可以封装任何 ES|QL 查询。我们从一个简单的过滤开始------来自 API gateway 的 HTTP 500 错误:
python
`
1. PUT _query/view/error_triage
2. {
3. "query": """
4. FROM svc-gateway-*
5. | WHERE http.response.status_code >= 500
6. | KEEP @timestamp, http.response.status_code, url.path, source.ip
7. """
8. }
`AI写代码
现在任何人都可以直接写 FROM error_triage,而无需了解索引模式或过滤条件:
sql
`
1. FROM error_triage
2. | STATS error_count = COUNT(*) BY url.path
3. | SORT error_count DESC
`AI写代码
查询只需定义一次,使用方通过名称引用。

视图通过 _query/view REST API 支持完整的 创建、读取、列出、更新 和 删除( CRUD )操作。
更新传播
假设团队决定 error_triage 不仅要捕获 500 错误,还要包含客户端错误。可以直接原地更新其定义:
python
`
1. PUT _query/view/error_triage
2. {
3. "query": """
4. FROM svc-gateway-*
5. | WHERE http.response.status_code >= 400
6. | KEEP @timestamp, http.response.status_code, url.path, source.ip
7. """
8. }
`AI写代码
每一个使用 FROM error_triage 的仪表板面板、告警规则和临时查询都会立即反映这一更广泛的过滤条件。无需逐个查找已保存对象,也不会存在过时的副本。一次更改,处处更新。

嵌套视图
视图可以引用其他视图,从而实现分层抽象。你可以分别创建用于可疑 IP 和威胁情报的视图,然后将它们组合起来:
less
`
1. PUT _query/view/suspicious_ips
2. {
3. "query": """
4. FROM svc-auth-*
5. | WHERE event.action == "login" AND event.outcome == "failure"
6. | STATS attempts = COUNT(*),
7. first_seen = FIRST(@timestamp, @timestamp),
8. latest_user = LAST(user.name, @timestamp)
9. BY source.ip
10. | WHERE attempts > 3
11. """
12. }
14. PUT _query/view/known_threats
15. {
16. "query": """
17. FROM threat-intel
18. """
19. }
21. PUT _query/view/security_overview
22. {
23. "query": """
24. FROM suspicious_ips, known_threats
25. """
26. }
28. FROM security_overview
29. | WHERE source.ip IS NOT NULL
30. | EVAL is_known_threat = threat.category IS NOT NULL
31. | KEEP source.ip, attempts, threat.category, threat.severity, is_known_threat
32. | SORT is_known_threat DESC, attempts DESC
`AI写代码
安全团队可以直接查询 FROM security_overview,而无需了解底层数据模型。同时,他们也不会受到 suspicious_ips 所有者对其所做任何变更的影响;这种抽象边界是真正的隔离,而不仅仅是语法层面的。

多数据源视图与子查询
视图可以封装任意 ES|QL 查询,包括使用 FROM 子查询的多数据源组合。每个子查询分支都会独立查询一个服务(各自的过滤条件、各自的字段规范化),结果会自动合并:
less
`
1. PUT _query/view/all_errors
2. {
3. "query": """
4. FROM
5. (FROM svc-gateway-*
6. | WHERE http.response.status_code >= 500
7. | EVAL service = "gateway",
8. error_detail = CONCAT("HTTP ", http.response.status_code::string)
9. | KEEP @timestamp, service, error_detail, source.ip),
10. (FROM svc-payments-*
11. | WHERE transaction.status IN ("failed", "timeout")
12. | EVAL service = "payments", error_detail = transaction.status
13. | KEEP @timestamp, service, error_detail, source.ip)
14. """
15. }
`AI写代码
使用方只需要写:
sql
`
1. FROM all_errors
2. | STATS error_count = COUNT(*) BY service
3. | SORT error_count DESC
`AI写代码
两个索引、两个独立流水线、一个名称。要添加第三个服务,只需增加第三个分支;现有分支不会改变,并且所有下游仪表板和告警都会自动反映更新。关于子查询语法以及在每个分支中可以做什么的深入讲解,可以参考《三个索引走进一个 FROM 子句》。
视图的底层工作方式
当你写 FROM view_name 时,ES|QL 会解析该视图的存储查询并将其内联执行。视图在每次读取时都会重新执行,因此结果始终反映当前数据和当前定义。
视图与索引、别名和数据流共享同一个命名空间。视图不能与这些对象同名(在创建时会强制校验)。这保证了 FROM my_name 的解析始终清晰,不会混淆是视图、索引还是别名。
安全模型
视图由四个专用 RBAC 权限管理:create_view、read_view_metadata、delete_view 和 manage_view。Elasticsearch 检查的是执行查询用户的权限(调用者安全模型),而不是视图创建者的权限。查询视图的用户需要同时拥有视图本身以及其底层索引的权限。
Kibana 集成
视图会在 Discover 的 ES|QL 编辑器自动补全中显示,与索引并列。基于 ES|QL 的仪表板面板可以透明地使用视图。在最初的技术预览版本中,视图管理仅支持 API 操作。未来计划在 Kibana 中提供创建和管理视图的 UI。
跨集群搜索
视图的定义可以使用 CCS 语法引用远程索引:
python
`
1. PUT _query/view/cross_cluster_errors
2. {
3. "query": """
4. FROM cluster-west:logs-*, cluster-east:logs-*
5. | WHERE log.level IN ("error", "crit")
6. """
7. }
`AI写代码
使用方可以直接查询 FROM cross_cluster_errors,而无需了解涉及哪些集群。
当前限制
在技术预览版本中,视图管理仅支持 API 操作,SET 指令不能出现在视图定义中;调用方在查询时再应用这些设置。基于子查询的视图也不能嵌套在其他多数据源 FROM 表达式中。完整限制列表请参考 views 文档。
视图的未来方向
当前视图始终是实时的,每次读取都会重新执行。物化视图则相反:先预计算一次,再快速读取。可以把它理解为预聚合的 rollup 视图,用于 SLA 仪表板,使加载速度达到毫秒级,而不是每次刷新都扫描原始数据。Kibana 中的视图 CRUD UI(包括 Discover 里的 "Save as View" 工作流)也在规划中。
试用
逻辑视图目前处于技术预览阶段,可以在 Kibana Dev Tools 或 Discover 中尝试使用。欢迎反馈问题,并在 GitHub 提交带 ES|QL 标签的 issue。
ES|QL 逻辑视图属于技术预览功能。技术预览功能可能发生变化,不受 GA 功能的支持 SLA 保障。本文中描述的任何功能发布与时间安排均由 Elastic 自行决定,部分功能可能不会按期交付,甚至可能不会提供。