作者:李捷
"学会选择很难。学会正确选择更难。而在一个充满无限可能的世界里学会正确选择则更难,也许是太难了。" 巴里-施瓦茨(Barry Schwartz)在《选择的悖论--多就是少》(The Paradox of Choice -More is Less)一书中的一段话概括了为什么灵活性和可定制性过高会让用户不知所措。现代生活中的大量选择可能会导致瘫痪和不满,而不是我们所期望的自由和幸福。多年来,我们在 _search API 中添加了更多的功能和特性,并提供了一个非常灵活和高度可定制的数据搜索平台。但在某些时候,这也是 Elasticsearch 不再像以前那样简单,尤其是对于那些刚刚起步的人来说
随着 Elasticsearch 8.11 版本的即将推出,我们非常高兴地宣布,我们将迎来一个全新的查询语言 ES|QL (Elasticsearch Query Language 的简称)。ES|QL 是一种更加一致、简洁、实用、高效的语言,旨在解决用户在使用 Elasticsearch 时面临的复杂性问题。这是一个里程碑式的发布,我们深知这将改变数据分析的方式,因此我们致力于提供最好的体验。新的 ES|QL 查询语言和引擎 (_query
API) 将会替代原有的语言和聚合引擎 (_search
API),成为大多数场景下的默认选择,并且将会有大幅的性能提升。
因此,在本博文以及接下来的系列文章中,我们将会带领大家提前预览和体验 ES|QL,这个 Elastic 在数年前就开始秘密开发的杀手级功能。这是一个重要的更新,我们也将会持续提供有关 ES|QL 的相关信息,以确保您可以尽快掌握这个新的功能。
Why ES|QL
Elasticsearch 是一个分布式、非关系型、半结构化、带有时间维度的强大数据平台,支持全文检索、聚合分析、机器学习等功能。在 Elasticsearch 的历史上,曾经诞生过多种语言,如 DSL、KQL、EQL、Lucene、SQL 等,这些语言为 Elasticsearch 的用户在不同的场景下提供了多样的查询能力。
语言 | 全称 | 说明 |
---|---|---|
DSL | Elasticsearch 特定领域语言 | Elasticsearch 最基础和最强大的查询语言,基于JSON格式 |
KQL | Kibana 查询语言 | 用于快速和交互式地进行数据探索和可视化的查询语言,基于文本格式 |
EQL | 事件查询语言 | 专门用于事件检测和威胁狩猎的查询语言,基于文本格式 |
Lucene | Elasticsearch 内部 Lucene 搜索引擎的原生语言 | 用于直接操作 Lucene 索引和文档的底层语言,基于文本格式 |
SQL | 标准结构化查询语言的本地子集 | 广泛使用的关系型数据库查询语言,基于文本格式 |
Painless | Elasticsearch 脚本语言 | 用于对数据进行自定义处理和计算的脚本语言,基于Java语法 |
Canvas | 由其他语言补充的表达式语言 | 用于创建动态和交互式的数据展示和可视化的表达式语言,基于文本格式 |
Timelion | 用于时间序列的表达式语言 | 用于对时间序列数据进行分析和可视化的表达式语言,基于文本格式 |
Vega | 用于描述数据处理和可视化的语法 | 用于创建复杂和高级的数据展示和可视化的语法,基于JSON格式 |
然而,这一情况也给用户带来了困扰,尤其是在需要决定在特定场合下应该使用哪种语言时。
复杂性是我们的敌人
虽然 Elasticsearch 在许多领域都表现出了非凡的能力,但其碎片化的查询语言在检索和分析方面给用户带来了挑战。我们所说的碎片化是什么意思?事实上,根据客户的反馈,在全观测性和安全分析场景中,在调查问题时,他们往往需要通过多达 6 个或更多的查询,使用不同的查询语言,并在 Kibana 中进行导航,才能找到所需的内容。因此,降低复杂性的关键在于能够在一个屏幕上以一种语言,以组合的方式尽可能多地在单一语句中进行搜索、过滤、转换、聚合和可视化。
并且,这种复杂性也表现在以下几个方面:
-
专业知识 - Elasticsearch 提供了丰富的功能,但需要在学习和配置方面进行投资。
-
经验 - 在调查过程中,需要多个窗口来提供必要的信息。规划和获取数据需要时间和精力。
-
语言 - Elastic 是变通之王。但是,实现查找、连接和内联统计等功能需要额外的工具。
因此,ES|QL 应运而生。ES|QL 的设计初衷是为了解决实际的查询问题,减轻用户学习负担,更加一致、简洁、实用、高效地解决实际问题。ES|QL 不仅具有直观易用性,还能在一个屏幕、一条语句中进行搜索、过滤、转换、汇总和可视化,从而减少复杂性的体现。
What is ES|QL
ES|QL 是一种功能强大的声明式语言,专为 Elasticsearch 设计,注重可组合性、表现力和速度。同时,它也是一种支持数据迭代探索的查询语言。
ES|QL 查询由一系列由管道分隔的命令组成。每个查询都以 Source 命令 开始。源命令会生成一个表,通常包含来自 Elasticsearch 的数据。
源命令后面可以跟一个或多个 处理命令。处理命令通过添加、删除或更改行和列来更改输入表。
你可以链接处理命令,并用管道符分隔:|
。每个处理命令都作用于前一个命令的输出表。
查询的结果是最终处理命令生成的表。
与之前提到的ES支持的各种搜索语言不同,这九种语言中的每一种都具有以下功能之一:过滤、处理、分组、重命名、排序、查找和列剪枝等功能。然而,不能同时实现所有这些功能。相比之下,ES|QL则能够在单一、统一的管道化命令语法和数据模型中执行所有这些功能。ES|QL相对于许多其他语言来说更易于使用,功能也更强大。它独立于DSL,并可利用Elasticsearch集群提供的分布式处理功能。
重要的是,ES|QL 将会成为 Elasticsearch 的默认搜索语言。
Highlight of ES|QL
专用高性能查询引擎
ES|QL 不仅是一种语言,还是 Elasticsearch 的一个完整的、专门的查询和计算引擎。ES|QL 查询不需要翻译或转换为 Query DSL:所有 ES|QL 查询都会经过词法分析、语法分析、语义分析、验证和优化,然后进行规划阶段以便对集群中的数据进行分布式执行。指定的目标节点负责本地执行,并利用 ES|QL 基础架构通过执行节点本地的重新规划来利用本地数据特性。
ES|QL 带来了一种在设计时考虑到性能的新执行引擎 ------ 以块(block)的形式执行,而不是逐行执行,以向量化运算 和缓存局部性为目标,并支持专业化和多线程。它是一个独立于现有 Elasticsearch 聚合框架的组件,具有不同的性能特征。
简单总结,ES|QL 的专用查询引擎具备以下特性:
-
无需转译或翻译
-
查询会被解析和优化以进行分布式执行
-
以块(block)的形式运行,而不是逐行执行
-
充分利用专业化和多线程技术
-
以向量化和高速缓存定位为目标
在我们当前的基准测试中,ESQL 在许多情况下都优于 DSL,即便不进行任何的优化措施,也比已有的聚合框架更快:
上图中展示了 ES|QL 与原有搜索引擎在不同场景中的性能对比:
-
绿色折线(search/aggs)代表已有的 DSL 搜索和原有的聚合引擎的性能
-
蓝色折线(esql/shard partitioning)代表 ES|QL 在分片数据上单核运行
-
粉红色折线(esql/doc partitioning)代表 ES|QL 在分片数据上多核运行
通过这个基准测试,我们看到,通过充分使用多线程技术,并且面向向量化和缓存的计算,ES|QL 已经实现了对现有框架在性能层面的遥遥领先,并且还将在未来充分受益于 Java 在向量化运算上的增强。
简约是终极的精致
我们深信简约是终极的精致,在 ES|QL,我们始终如一地践行这一理念。ES|QL 提供了管道式查询语言,让您能够轻松地在单一的语句中完成搜索、汇总、计算、转换和可视化等所有操作。并且,ES|QL 的查询语言与您可能已经熟悉的其他查询语言相似,为您提供了无缝体验。而在我们的下一代搜索引擎的设计标准是,需要能够实现更快的搜索速度,同时为数据调查和探索提供了全面的语言。我们一直致力于为用户提供更好的体验,并不断突破数据分析的极限。
其优势表现为:
-
更快的查询速度:利用 Elasticsearch 查询引擎,可在多个阶段同时执行搜索和聚合,从而提高速度和效率。
-
简化 Elasticsearch 和数据摄取:Elasticsearch 的搜索功能非常丰富,但需要投资学习。ES|QL 语法大大简化了对 Elasticsearch 及其功能的使用和理解。
-
全新的变革性搜索引擎 :ES|QL 查询引擎提供了lookup等新功能。只需一次查询,即可轻松实现搜索、聚合、计算和数据转换。未来,ES|QL 还将提供 inline stats 和 joins等其他功能。
-
快速洞察:直接从 Kibana Discover 创建可视化、计算和聚合,将调查工作流程浓缩在一个屏幕中,从而更快地获得答案。
-
减少将数据引入 Elasticsearch 的摩擦:无论数据来源、结构、复杂性或数量如何,ES|QL 都能简化 Elasticsearch 中的数据摄取。
-
警报:利用 ES|QL 写入可观测性和安全警报,并将汇总值作为阈值。通过强调有意义的趋势而非孤立的事件、减少误报并提供更具操作性的通知,提高检测准确性。
在解决方案上的增强
基于上面提到的 ES|QL 的诸多优点,在 Elastic 搜索平台上,各种解决方案都能够受益于 ES|QL 的强大功能。
搜索
使用 Elasticsearch 查询语言(ES|QL)提升搜索能力,这是一种创新的管道查询语言和引擎,旨在提供更好的开发体验和更高的性能。利用 ES|QL,用户可以在一次查询中检索、汇总、计算和转换数据。它的主要功能包括在查询时定义字段、执行数据丰富查询和并发处理查询。使用 ES|QL 以多种方式了解和探索数据。从利用客户端直接集成 API/代码,到直接从 Kibana 的搜索框中可视化结果,ES|QL 简化了您的数据调查,确保您轻松简单地从数据集中获得最大收益。有了 ES|QQL,开发人员将体会到代码和查询复杂性的降低,从而节省时间和成本。ES|QL 简化了查询结果在后续搜索中的使用,减少了对复杂脚本和多次查询的依赖,从而降低了计算成本。ES|QL 不仅仅是一个应用程序接口,它还是一种简单而强大的方式,可帮助您改变搜索方法。
全观测
使用 Elasticsearch 查询语言 (ES|QL),在 Elastic Observability 中对数据进行可视化和分析。您可以直接从搜索栏汇总、转换、计算和搜索您的指标、日志和跟踪数据,只需一次查询,即可优化定位性能瓶颈和系统问题,缩短解决问题的时间,消除浏览多个屏幕的麻烦。ES|QL 的高级查询引擎引入了多种功能,如在查询时定义字段、查找数据以丰富数据,以及并发查询处理以提高速度和效率。ES|QL 不仅能处理各种可观测性数据(无论数据来源和结构如何),还能帮助建立以汇总值作为阈值的可观测性警报。ES|QL 与 Elastic ML 和 AiOps 可通过强调有意义的趋势而非孤立事件、减少误报并提供更多可操作的通知,帮助提高检测准确性。ES|QL 可直接从搜索栏提供查询、聚合和可视化功能,从而确保系统性能和正常运行时间。
安全分析
利用 ES|QL(Elasticsearch 查询语言)提升安全态势。无论数据来源和结构如何,它都能加快 SecOps 工作流程并提高警报准确性。
快速灵活地搜索数据,并即时定义新字段,以推动调查和响应。汇总结果,例如查看最常访问的服务器。执行计算,例如入站流量和出站流量的比率。利用地理位置等上下文丰富结果。将结果可视化,以了解有意义的模式和异常情况。所有这些都只需一次管道式查询。
为了更准确地发出警报并减少警报疲劳,可在检测规则中加入汇总值。结果:信号更多,噪音更少。
ES|QL 对每个 SOC 开放,对每个分析师友好:
通过查找丰富数据:通过在当前数据集中引入额外的上下文,ES|QL 可提供更全面的视图,这在安全调查中至关重要。例如,客户可以通过一个搜索栏对 IP 地址执行查询,以确定其地理位置、与已知恶意实体的关联,或是否属于已知的云服务提供商。
总之,ES|QL 作为 Elastic 搜索平台上的核心功能,为各种解决方案带来了非凡的收益。它提供了高效准确的搜索、强大的数据分析和可视化能力,以及高度可扩展性和灵活性。这些优势使得各种解决方案能够更好地满足用户需求,并为企业带来更大的价值。
我在哪里可以得到它?
ES|QL 代码可在 Elasticsearch主分支中获取,并将作为 Elasticsearch 8.11 中的技术预览版发布。这是一项免费功能(basic订阅级别),可供所有人使用。每晚快照很快就会可供下载,因此请随时查看代码并自行构建。
因为我们正处于 ES|QL 的早期阶段,可能存在一些未解决的问题、障碍,甚至是错误,请提出问题。我们迫不及待地想与 Elasticsearch 社区分享 ES|QL!
我们代表 ES|QL 团队期待您的反馈!