Elasticsearch ES|QL 视图:一个查询统领十二个仪表板

作者:来自 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写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

安全团队可以直接查询 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写代码![](https://csdnimg.cn/release/blogv2/dist/pc/img/runCode/icon-arrowwhite.png)

使用方只需要写:

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 自行决定,部分功能可能不会按期交付,甚至可能不会提供。

原文:www.elastic.co/search-labs...

相关推荐
AC赳赳老秦12 小时前
知识产权辅助:用 OpenClaw 批量生成专利交底书 / 软著申请材料,自动校验格式与内容合规性
java·人工智能·python·算法·elasticsearch·deepseek·openclaw
历程里程碑13 小时前
4 Git远程协作:从零开始,玩转仓库关联与代码同步(带实操代码讲解)
大数据·c++·git·elasticsearch·搜索引擎·gitee·github
苍煜13 小时前
MySQL分库分表和ES到底怎么选?
数据库·mysql·elasticsearch
摇滚侠18 小时前
DSL 学习 ElasticSearch 主要就是学习 DSL 查询语言
学习·elasticsearch·jenkins
用户97471381214020 小时前
Elasticsearch 文档版本控制实验手册
elasticsearch
摇滚侠21 小时前
自动补全 黑马 Elasticsearch 全套教程,黑马旅游网案例
大数据·elasticsearch·搜索引擎
逸Y 仙X21 小时前
文章二十一:ElasticSearch 词项查询与调度查询实战
java·大数据·数据库·elasticsearch·搜索引擎
摇滚侠1 天前
数据聚合 黑马 Elasticsearch 全套教程,黑马旅游网案例
大数据·elasticsearch·搜索引擎
Elasticsearch1 天前
如何衡量和提升 Elasticsearch 搜索召回率:通过 混合搜索 从 0.43 提升到 0.75
elasticsearch