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,请按照下列步骤操作:
- 检查先决条件。
- 添加丰富的数据。
- 制定丰富策略。
- 执行丰富策略。
- 使用丰富策略
设置丰富策略后,你可以更新丰富数据并更新丰富策略。
重要:ENRICH 命令执行多项操作,可能会影响查询速度。
1. 前提条件
要使用丰富策略,你必须具备:
- 针对所使用的任何索引必须具有 read 的索引权限
- rich_user 内置角色
2. 添加丰富数据
首先,将文档添加到一个或多个源索引。 这些文档应包含你最终想要添加到传入数据中的丰富数据。
你可以使用 document 和 index API 管理源索引,就像管理常规 Elasticsearch 索引一样。
你还可以设置 Beats(例如 Filebeat)来自动发送文档并将其索引到源索引。 请参阅 Beats 入门。
3. 创建丰富策略
将丰富数据添加到源索引后,使用 create enrich policy API 或 Kibana 中的索引管理来创建丰富策略。针对英文不是很好的开发者来说,你可以阅读如下的文章:
-
Elasticsearch:如何使用 Elasticsearch ingest 节点来丰富日志和指标
-
Elasticsearch:使用 Elasticsearch ingest pipeline 丰富数据
-
Elasticsearch:enrich processor (7.5发行版新功能)
-
Elasticsearch 的新 range 丰富策略使上下文数据分析更上一层楼 - 7.16
警告:创建后,你将无法更新或更改丰富策略。 请参阅下面的更新丰富策略。
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 将根据匹配字段值在丰富索引中查找记录。
ROW language_code = "1"
| ENRICH languages_policy
| language_code:keyword | language_name:keyword |
|---|---|
| 1 | English |
默认情况下,策略中定义的每个丰富字段都会添加为一列。 要显式选择添加的丰富字段,请使用 WITH <field1>, <field2>...:
ROW a = "1"
| ENRICH languages_policy ON a WITH language_name
| a:keyword | language_name:keyword |
|---|---|
| 1 | English |
你可以使用 WITH new_name=<field1>重命名添加的列:
ROW a = "1"
| 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 类型的列进行丰富。
相关文章:
Elasticsearch:ES|QL 中的数据丰富
在之前的文章 “Elasticsearch:ES|QL 查询语言简介”,我有介绍 ES|QL 的 ENRICH 处理命令。ES|QL ENRICH 处理命令在查询时将来自一个或多个源索引的数据与 Elasticsearch 丰富索引中找到的字段值组合相结合。这个有点类似于关系数据库查询中所使用的 jo…...
【linux编程】linux文件IO高级I/O函数介绍和代码示例
Linux文件IO高级I/O函数用法是指如何使用这些函数来实现高效和灵活的文件读写操作,它们包括以下几类: 分散读和集中写:readv和writev函数可以一次性地从一个文件描述符读取或写入多个缓冲区,而不需要多次调用read或write函数。这样可以减少系统调用的开销,提高I/O效率。存…...
jQuery获取地址栏GET参数值
jQuery获取地址栏GET参数值 封装方法: window.location 是获取当前页面地址 // 获取地址栏参数 function GetUrlString(name){var reg new RegExp("(^|&)" name "([^&]*)(&|$)");var r window.location.search.substr(1).match…...
JAVA应用中线程池设置多少合适?
目录 1、机器配置: 2、核心线程数 3、最大线程数多少合适? 4、理论基础 5、测试验证 一个线程跑满一个核心的利用率 6个线程 12 个线程:所有核的cpu利用率都跑满 有io操作 6、计算公式 7、决定最大线程数的流程: 1、机器…...
.Net Core 3.1 解决数据大小限制
微软官网文档上对.NET Core3.1解决数据大小限制有详细的介绍。下面是根据自己的情况进行的总结,我们可以把.Core项目部署在IIS上,也可以利用Kestrel进行部署。这两种方式处理数据大小限制的方式不一样,具体如下: 一、部署在IIS上…...
【音视频 | opus】opus编码的Ogg封装文件详解
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...
【微信小程序】自定义组件(一)
自定义组件 组件的创建与引用1、创建组件2、引用组件3、全局引用VS局部引用4、组件和页面的区别 样式1、组件样式隔离2、组件样式隔离的注意点3、stylelsolation的可选值 数据、方法和属性1、data数据2、methods方法3、properties4、data和properties区别5、使用setData修改pr…...
如何通过一条数字人三维动画宣传片,打造出数字文旅
越来越多虚拟人,以文化挖掘者的身份通过数字人三维动画宣传片,打通次元壁,助力文化传播形式创造性转化、创新性表达,赋予文化发展新动能。 如南方都市报民间博物馆文化探寻者“岭梅香”,由一艘在南宋时期失事的沉船“南…...
【MongoDB】索引 - 数组字段的多键索引
数组字段创建索引时,MongoDB会为数组中的每个元素创建索引键(多键索引),多键索引支持数组字段的高效查询。 一、准备工作 这里准备一些数据 db.shop.insertMany([{_id: 1, name: "水果店1", fruits: ["apple&qu…...
2023.11.5 关于 Spring 创建 和 使用
目录 创建 Spring 项目 1.创建 Maven 项目 2.添加 Spring 依赖 将 Bean 对象存储到 Spring 容器中 创建 Bean 存储 Bean ApplicationContext 获取 Bean BeanFactory 获取 Bean ApplicationContext 和 BeanFactory 的区别 获取 Bean 的三种方式 根据 Bean id 获取…...
3D目标检测实战 | 图解KITTI数据集评价指标AP R40(附Python实现)
目录 1 准确率和召回率2 P-R曲线的绘制3 AP R11与AP R40标准4 实际案例 1 准确率和召回率 首先给出 T P TP TP、 F P FP FP、 F N FN FN、 T N TN TN的概念 真阳性 True Positive T P TP TP 预测为正(某类)且真值也为正(某类)的样本数,可视为 I o U > I o U t…...
制作一个ros2机器人需要学习的课本(还不全面)
1《C语言》---这个是基础200页左右 2《C》-----500-600页 3《高等数学》-----没有这个无法计算动态电路 4《电路分析》-----没有这个没法设计硬件电路 5《英语5000词汇》最少也得达到美国小学生毕业时候的词汇水平5000词汇量 6《ros1》因为ros2没有一本中文课本---有那么一…...
Qt OpenGL相机系统
文章目录 一、简介二、实现代码三、实现效果参考资料效果展示 一、简介 一直偷懒没有学习OpenGL,乘着这段有点时间重新学习一下OpenGL,做一个简单的小工具,有助于后面理解OSG。我们都知道OpenGL中存在着下面几个坐标空间:模型空间(物体空间)、世界空间、观察空间(或者称…...
英语语音识别,语言评测,语音打分实践与代码实现
项目在这:couldn/speech-evaluation-of-english 详细的可查看项目内的md文档...
【SpringBoot篇】SpringBoot整合Mybatis实战
🎊专栏【SpringBoot】 🍔喜欢的诗句:天行健,君子以自强不息。 🎆音乐分享【如愿】 🎄欢迎并且感谢大家指出小吉的问题🥰 文章目录 🌺Spring Boot和MyBatis的好处🌺创建工…...
android c++ 硬编码硬解码官方demo
参考: https://fossies.org/linux/opencv/modules/videoio/src/cap_android_mediandk.cpp 代码: // This file is part of OpenCV project.// It is subject to the license terms in the LICENSE file found in the top-level directory// of this d…...
Python之Excel数据相关
Excel Microsoft Excel是Microsoft为使用Windows和Apple Macintosh操作系统的电脑编写的一款电子表格软件。直观的界面、出色的计算功能和图表工具,再加上成功的市场营销,使Excel成为最流行的个人计算机数据处理软件。在1993年,作为Microsof…...
Ubuntu网络IP地址一直显示127.0.0.1
问题描述: 终端输入ip a显示127.0.0.1,原来类似192.168.231.1的地址不见了。 ip a 点击网络配置(ubuntu桌面版),发现无线网络模块看不见了 正常情况应该有wired 模块,就是下面标红的 解决方案:…...
Vulnhub-DC-3 靶机复现完整过程
啰嗦两句: 提权之前完成是一个月前做的,当时在提权处出了点问题就搁置了,今天才完成,所以IP地址可能会会有变化 注意:后续出现的IP地址为192.168.200.55同样是靶机IP地址,若本文能有帮助到你的地方…...
Dubbo篇---第三篇
系列文章目录 文章目录 系列文章目录一、Dubbo 容错策略二、Dubbo 动态代理策略有哪些?三、说说 Dubbo 与 Spring Cloud 的区别?一、Dubbo 容错策略 failover cluster 模式 provider 宕机重试以后,请求会分到其他的 provider 上,默认两次,可以手动设置重试次数,建 议把写…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
【实施指南】Android客户端HTTPS双向认证实施指南
🔐 一、所需准备材料 证书文件(6类核心文件) 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...
运行vue项目报错 errors and 0 warnings potentially fixable with the `--fix` option.
报错 找到package.json文件 找到这个修改成 "lint": "eslint --fix --ext .js,.vue src" 为elsint有配置结尾换行符,最后运行:npm run lint --fix...
CppCon 2015 学习:Simple, Extensible Pattern Matching in C++14
什么是 Pattern Matching(模式匹配) ❝ 模式匹配就是一种“描述式”的写法,不需要你手动判断、提取数据,而是直接描述你希望的数据结构是什么样子,系统自动判断并提取。❞ 你给的定义拆解: ✴ Instead of …...
