Elasticsearch:ES|QL 中的数据丰富

在之前的文章 "Elasticsearch:ES|QL 查询语言简介",我有介绍 ES|QL 的 ENRICH 处理命令。ES|QL ENRICH 处理命令在查询时将来自一个或多个源索引的数据与 Elasticsearch 丰富索引中找到的字段值组合相结合。这个有点类似于关系数据库查询中所使用的 join。

例如,你可以使用 ENRICH 来:

  • 根据已知 IP 地址识别 Web 服务或供应商
  • 根据产品 ID 将产品信息添加到零售订单
  • 根据电子邮件地址补充联系信息

ENRICH 命令如何工作

ENRICH 命令将新列添加到表中,其中包含来自 Elasticsearch 索引的数据。 它需要一些特殊的组件:

丰富政策 - enrich policy

丰富策略是一组配置选项,用于将正确的丰富数据添加到输入表中。

丰富策略包含:

  • 将丰富数据存储为文档的一个或多个源索引的列表
  • 确定处理器如何将丰富数据与传入文档进行匹配的策略类型
  • 源索引中的匹配字段,用于匹配传入文档
  • 丰富字段,包含来自要添加到传入文档的源索引的丰富数据

创建策略后,必须执行(execute)后才能使用。 执行丰富策略使用策略源索引中的数据来创建称为丰富索引 (enrich index) 的简化系统索引。 ENRICH 命令使用此索引来匹配和丰富输入表。

源索引 - source index

存储 ENRICH 命令用于添加到输入表的丰富数据的索引。 你可以像常规 Elasticsearch 索引一样创建和管理这些索引。 你可以在丰富策略中使用多个源索引。 你还可以在多个丰富策略中使用相同的源索引。

丰富索引 - enrich index

与特定丰富策略相关的特殊系统索引。这个是由系统生成的。在我们执行完 execute 命令后,系统会生成这个索引。

直接将输入表中的行与源索引中的文档进行匹配可能会很慢并且会占用大量资源。 为了加快速度,ENRICH 命令使用丰富索引。

丰富索引包含来自源索引的丰富数据,但有一些特殊属性可以帮助简化它们:

  • 它们是系统索引,这意味着它们由 Elasticsearch 内部管理,并且仅适用于丰富处理器和 ES|QL ENRICH 命令。
  • 它们总是以 .enrich-* 开头。
  • 它们是只读的,这意味着您无法直接更改它们。
  • 它们被 force merged 以便快速检索。

创建丰富策略 - enrich policy

要开始使用 ENRICH,请按照下列步骤操作:

  1. 检查先决条件。
  2. 添加丰富的数据。
  3. 制定丰富策略。
  4. 执行丰富策略。
  5. 使用丰富策略

设置丰富策略后,你可以更新丰富数据并更新丰富策略。

重要:ENRICH 命令执行多项操作,可能会影响查询速度。

1. 前提条件

要使用丰富策略,你必须具备:

  • 针对所使用的任何索引必须具有 read 的索引权限
  • rich_user 内置角色

2. 添加丰富数据

首先,将文档添加到一个或多个源索引。 这些文档应包含你最终想要添加到传入数据中的丰富数据。

你可以使用 documentindex API 管理源索引,就像管理常规 Elasticsearch 索引一样。

你还可以设置 Beats(例如 Filebeat)来自动发送文档并将其索引到源索引。 请参阅 Beats 入门

3. 创建丰富策略

将丰富数据添加到源索引后,使用 create enrich policy API 或 Kibana 中的索引管理来创建丰富策略。针对英文不是很好的开发者来说,你可以阅读如下的文章:

警告 :创建后,你将无法更新或更改丰富策略。 请参阅下面的更新丰富策略

4. 执行丰富策略

创建丰富策略后,你需要使用 execute enrich API 或 Kibana 中的索引管理来执行它,以创建丰富索引 - enrich index

丰富索引包含来自策略源索引的文档。 丰富索引始终以 .enrich- * 开头,是只读的,并且强制合并 (force merged)。

警告 :丰富索引只能由丰富处理器(enrich processor)或 ES|QL ENRICH 命令使用。 避免将丰富索引用于其他目的。

5. 使用丰富策略

执行策略后,你可以使用 ENRICH 命令来丰富你的数据。

以下示例使用 languages_policy 丰富策略为策略中定义的每个丰富字段添加一个新列。 使用丰富策略(enrich policy)中定义的 match_field 执行匹配,并要求输入表具有相同名称的列(本例中为 language_code)。 ENRICH 将根据匹配字段值在丰富索引中查找记录。

ini 复制代码
1.  ROW language_code = "1"
2.  | ENRICH languages_policy
language_code:keyword language_name:keyword
1 English

默认情况下,策略中定义的每个丰富字段都会添加为一列。 要显式选择添加的丰富字段,请使用 WITH , ...:

ini 复制代码
1.  ROW a = "1"
2.  | ENRICH languages_policy ON a WITH language_name
a:keyword language_name:keyword
1 English

你可以使用 WITH new_name=重命名添加的列:

ini 复制代码
1.  ROW a = "1"
2.  | ENRICH languages_policy ON a WITH name = language_name
a:keyword name:keyword
1 English

如果发生名称冲突,新创建的列将覆盖现有列。

更新丰富索引 - enrich index

创建后,你无法更新文档或将其索引为丰富索引。 相反,你需要更新你的源索引并再次 执行丰富策略。 这会根据更新的源索引创建一个新的丰富索引。 先前的丰富索引将通过延迟的维护作业删除。 默认情况下,每 15 分钟执行一次。

更新丰富策略

创建后,你将无法更新或更改丰富策略。 相反,你可以:

  • 创建并执行新的丰富策略。
  • 在任何正在使用的丰富处理器或 ES|QL 查询中,将以前的丰富策略替换为新的丰富策略。
  • 使用 delete enrich API 或 Kibana 中的索引管理来删除之前的丰富策略。

局限性

ES|QL ENRICH 命令仅支持匹配 (match) 类型的丰富策略。 此外,ENRICH 仅支持对 keyword 类型的列进行丰富。

相关推荐
Elastic 中国社区官方博客9 小时前
不到 5 分钟完成本地部署:Jina embedding 模型现已支持本地部署
大数据·人工智能·elasticsearch·搜索引擎·embedding·jina
二进制流水搬运工9 小时前
入职第一天拉了23个仓库,我写了个脚本解放双手
大数据·elasticsearch·搜索引擎
Elasticsearch10 小时前
在不到一小时内将 Datadog Kubernetes 仪表板迁移到 Elastic Observability
elasticsearch
.柒宇.11 小时前
Elasticsearch 核心概念与系统架构详解
elasticsearch·系统架构
风行無痕13 小时前
单机Elasticsearch 8.19.18安全升级到9.4.3的过程
大数据·elasticsearch·搜索引擎
Elastic 中国社区官方博客14 小时前
使用重新设计的 AutoOps 更快地进行 Elasticsearch 问题排查
大数据·运维·前端·人工智能·elasticsearch·搜索引擎·全文检索
阿拉雷️15 小时前
【搜索实战】Spring Boot 3.3 + AI Agent × Elasticsearch:让AI自动优化搜索策略,查询速度从2秒压到50毫秒
人工智能·spring boot·elasticsearch
阿里云大数据AI技术1 天前
阿里云 ES AI 引擎版:面向 Agent 场景,为亿级租户、千亿规模向量设计的搜索引擎
人工智能·elasticsearch·agent
阿里云大数据AI技术1 天前
FalconSeek 技术解析:阿里云 Elasticsearch 云原生内核如何让查询性能飙升600%
人工智能·elasticsearch
Elastic 中国社区官方博客1 天前
将你的 Grafana Kubernetes 仪表板迁移到 Elastic Observability:相同的 PromQL,30 倍更快的查询
大数据·人工智能·elasticsearch·搜索引擎·容器·kubernetes·grafana