ES|QL 连接来了!是的,连接!

Elasticsearch 8.18 包含了 ES|QL 的查找连接命令,这是我们第一个 SQL 风格的连接命令。

Elasticsearch 8.18 包含了我们的第一个 SQL 风格的 JOIN: ES|QL 的查找连接命令。它现已提供技术预览版,支持通过易于更新的查找数据集实现数据关联和丰富。需要为您的事件添加主机和资产信息吗?没问题。想查看威胁情报列表中的 IP 地址或 URL 吗?当然!更新查找数据集并立即使用它们?请尽管使用!

查找连接是一种 SQL 风格的 LEFT OUTER JOIN,依赖于右侧名为
查找的新索引模式。查找索引可以是资产、威胁情报数据(如已知恶意 IP)、订单信息、员工或客户信息 — 可能性无限。

右侧的查找

从历史上看,Elasticsearch 缺乏连接功能,尽管随着时间的推移,人们在这方面做了几次尝试,例如嵌套、_parent 和连接字段类型,以及丰富功能。我们通常鼓励通过将参考数据与事件数据存储在同一索引中,或在客户端进行连接操作,来实现数据的去规范化。然而,这些解决方案在处理大规模数据时会影响可扩展性,并且在面对多样化数据和用例时可能受到限制。现在是 Elasticsearch 实现连接功能的时候了。而如今这已成为可能:ES|QL 不只是一种语言——它建立在一个全新的计算引擎之上。ES|QL 引擎使得执行连接等高级功能成为现实。

为了启用查找连接,我们创建了一种新的索引模式:查找。查找索引与常规索引(默认为标准模式)基本相同,这意味着它可以直接更新。主要区别在于,查找索引仅使用一个分片。因此其文档数量上限为 20 亿,这是 Lucene 对单个分片的限制。对于许多查找连接用例而言,这一容量足以容纳“右侧”数据。通过施加此限制,我们可以减少连接右侧的数据源基数,从而避免完全分布式连接带来的一些问题。此外,这还能让我们了解您计划使用哪些数据集作为查找参考,以便我们将来能够针对这些数据集进行优化。

除了查找索引模式之外,对源数据没有任何限制,也无需进行连接所需的数据准备。这意味着添加查找数据集非常容易,而且也很容易保持其最新状态。

ES|QL 中的 ENRICH 命令已经可以实现其中的一些功能。ENRICH 针对摄取管道中的摄取时间查找以及不经常更改的小数据集进行了优化,因此它很方便,但并不理想。查找连接比数据丰富更容易设置和管理:

  • 没有可创建的扩充策略

  • 无策略执行

  • 查找索引是可写的

  • 数据副本减少

  • 更好地处理多个匹配项——当有多个匹配项时,Enrich 会创建多值字段,而查找连接会创建多个行。这使得后续的分析操作(如分组和汇总)更加便捷,例如按用户计算的传输字节数或订单总额。

  • 查找连接允许即时指定匹配字段

以下是您可能使用 LOOKUP JOIN 的几种方式:

  • 将安全事件与威胁情报结合起来,进一步丰富事件内容

  • 查找您当前的主机集与最新的威胁情报或内部元数据

  • 将 IOT 读数与静态或动态元数据(制造商、容量单位)相关联

  • 能否请您将安全事件与主机信息结合,以便获得更多上下文信息和更精准的过滤

  • 补充一些事实,比如资产关键性(此用户是高管)

  • 将 CrowdStrike AID 添加到包含主机名的源中

  • 检查某些 IP 地址是否在威胁情报源中

  • 将员工信息添加到活动中

可能性是无限的。

示例用法

让我们来看一些真实示例,看看这到底有多简单、多强大。

作为 SRE,您可能需要:

  • 根据 IP 地址或主机名向日志添加环境

  • 将员工信息加入日志

  • 找出哪个团队拥有服务器

在查找连接之前,您必须:

  1. 将参考数据(环境)放入索引中

  2. 基于该索引定义富化策略,指定策略类型、匹配字段和富化字段

  3. 请执行一次富化策略以构建富化索引

  4. 对每个参考数据集(员工、团队)重复此操作

  5. 每当数据发生更改时,系统将自动执行富化策略

借助 LOOKUP JOIN,只需将参考数据放入 LOOKUP 索引中即可!

想象一下,您收到一条警报,提示您的电子商务网站有用户遇到错误。您发现了一些 Web 日志,其中响应并非表示成功的 200 HTTP 响应代码。您想按环境细分这些日志,以查看生产环境的客户是否受到影响,但日志中没有环境字段。没关系——只需添加一个基于环境的查找连接,或许可以使用类似这样的文件:

clientip,environment
192.168.1.9,QA
192.168.14.2,Dev
192.168.12.3,Prod
…

现在在环境查找索引(我的索引名为 envs_lkp)上添加查找连接:

FROM kibana_sample_data_logs | WHERE response.keyword != "200" 
| LOOKUP JOIN envs_lkp ON clientip 
| STATS COUNT(*) by response, environment
查找连接

生产和质量保证 (QA) 环节存在错误。我们可以一起对比每个 Web 服务器拥有的团队名单,看看应该联系谁:

host,team
www.elastic.co,Web team
artifacts.elastic.co,Delivery team
cdn.elastic-elastic-elastic.org,Cloud team
elastic-elastic-elastic.org,Web team
FROM kibana_sample_data_logs | WHERE response.keyword != "200"
| LOOKUP JOIN teams_lkp ON host
| STATS num = COUNT(*) by host, response.keyword, team
| SORT num DESC
团队所有权列表

安全分析师都喜欢他们的加入!也许他们会想:

  • 识别请求已知恶意 URL 的客户端 IP 地址

  • 与资产信息关联以对事件进行分组并分配优先级或风险

您可以从 Abuse.ch 的 URLhaus 下载恶意 URL 列表,并将其上传到查找索引。

FROM logs 
| LOOKUP JOIN urlhaus_lkp ON url 
| WHERE threat IS NOT NULL 
| KEEP @timestamp, url.keyword, clientip, threat
下载恶意 URL 列表

如何创建查找

您至少需要一个查找索引来使用查找连接。我们正在设计更轻松、便捷的方法,以便在 Kibana 中创建和更新查找索引。目前,您可以通过几种方式先创建查找索引——关键在于索引模式必须设置为“查找”。

使用索引管理创建查找索引

在 Kibana 的左侧导航窗格中,单击 Stack Management,然后单击“索引管理”。在右侧,单击“创建索引”

使用索引管理创建查找索引

提供索引名称,然后从“索引模式”下拉菜单中选择“查找”:

提供索引名称

单击“创建”以创建一个空的查找索引。

通过 API 创建查找索引

使用创建索引 API 来创建查找索引——只需确保包含索引模式:

PUT mylookupindex
{
 "settings": {
   "index.mode": "lookup"
 }
}

使用 ML 文件上传器创建查找索引

在 Kibana 的左侧导航窗格中,单击“机器学习”,然后单击“文件数据可视化工具”(或在 Kibana 的搜索栏中键入“上传”)。

文件数据可视化工具

选择或拖放您的文件——CSV 非常适合此操作。

点击“导入”后,为索引命名,然后点击“高级”以显示索引设置。在此处,您需要添加“index.mode: lookup”。

高级

点击“导入”完成文件上传。系统将创建索引和数据视图。

在所有情况下,您现在都可以在 ES|QL 查询中引用查找索引。

解决常见问题

问:什么时候不应该使用连接?
查找连接确实很强大,但功能强大……嗯,您知道的。连接可能是一项昂贵的操作,并且每次连接都会增加查询的延迟。在某些情况下,连接可能过度或不是最佳选择。例如,如果您经常将某个字段连接到许多查询中,请考虑将其非标准化为左侧索引。在采集时使用丰富采集处理器、文件采集器配置、使用 Logstash 筛选等进行添加。这种一次性采集处理是在存储使用量略有增加以加快查询速度之间进行权衡。这将最适用于不经常更改(用户 ID 的用户名)或永不更改(主机制造商)的参考值。

问:可以直接查询查找吗?
是的!查找索引大多“只是一个索引”,因此您可以使用 ES|QL 进行查询。

FROM <lookup_index> | …

或者,创建一个数据视图。

创建数据视图

问:可以从 Logstash 或代理发送数据吗?
是的!请记住,查找索引不是数据流,它只是一个分片,因此您“只能”向每个查找索引发送最多 20 亿个文档。

未来动向

我们正在努力消除一些已知的限制,以便查找连接功能能够全面上线。此外,我们正在为查找数据集设计一流的编辑体验。想象一下,能够直接在 Kibana Discover 中创建和编辑查找索引,或者将 CSV 文件拖放到 Discover 中来填充索引。以下是可能呈现效果的示意图:

潜在未来查找编辑用户体验的早期原型
潜在未来查找编辑用户体验的早期原型

而查找连接只是开始。我们希望提供其他有用的连接类型,例如 INNER 连接或子查询,并且允许针对任何索引(不仅仅是查找索引)进行连接。

开始使用

这就是查找连接,在 Elasticsearch 8.18/9.0 技术预览版中提供

 

准备好开始了吗?Elastic 8.18 和 9.0 现已在 Elastic Cloud 上线。Elastic Cloud 是一项托管 Elasticsearch 服务,包含最新版本中的所有新功能。我们代表 ES|QL 团队期待您的反馈——您可以使用 Discover 的 ES|QL 编辑器中的“提交反馈”按钮。顺便说一下,我们一路写完这篇关于“连接”的博客,居然没有使用任何与“连接”相关的双关语……感谢您的参与!

 

 

本文中描述的任何功能或功能性的发布和时间均由 Elastic 自行决定。当前尚未发布的任何功能或功能性可能无法按时提供或根本无法提供。