Elasticsearch 8.18 中提供了原生连接 (Native Joins)
作者:来自 Elastic Costin Leau
探索 LOOKUP JOIN,这是一条在 Elasticsearch 8.18 的技术预览中提供的新 ES|QL 命令。
很高兴宣布 LOOKUP JOIN —— 这是一条在 Elasticsearch 8.18 的技术预览中提供的新 ES|QL 命令,旨在执行左 joins 以进行数据增强。通过 ES|QL,用户可以根据定义如何在 Elasticsearch 中本地配对文档的标准,将来自一个索引的文档与来自另一个索引的文档查询和组合。这种方法通过在查询时动态关联跨多个索引的文档,从而减少了重复数据,提高了数据管理效率。
例如,以下查询将来自一个索引的员工数据与另一个索引中对应的部门信息连接,使用共享的字段键名称:
FROM employees
| LOOKUP JOIN departments ON dep_id
正如其名称所示,LOOKUP JOIN 在查询时执行一个补充的或左(外部)连接,连接任何常规索引(employees 索引)—— 左侧和任何查找索引(departments 索引)—— 右侧。左侧的所有行将与右侧的相应行(如果有的话)一起返回。
查找侧的索引模式必须设置为 lookup。这意味着底层索引只能有一个分片。当前的解决方案解决了连接一侧的基数挑战,以及像 Elasticsearch 这样的分布式系统所遇到的问题,这些问题将在下一节中详细说明。
除了使用 lookup 索引模式外,对源数据或使用的命令没有限制。此外,无需进行数据准备。
连接可以在过滤之前或之后执行:
// associate employees hired in the last year in departments in US and sort by department name
FROM employees
| WHERE hire_date > now() - 1 year
| LOOKUP JOIN departments ON dep_id
| WHERE dep_location == "US"
| KEEP last_name, dep_name, dep_location
| SORT dep_name
与聚合混合使用:
// count employees per country
FROM employees
| STATS c = COUNT(*) BY country_code
| LOOKUP JOIN countries ON country_code
| KEEP c, country_name
| SORT country_name
或与另一个 join 结合使用:
// find the error messages in the last hour alongside their source host name and error description
FROM logs
| WHERE message_type :"error"
| LOOKUP JOIN message_types ON err_code
| LOOKUP JOIN host_to_ips ON src_ip
| WHERE log_date > now() - 1 hour
| KEEP log_date, log_type, err_description, host_name
执行 Lookup Join
让我们通过查看一个不包含其他命令(如 filter)的基本查询来说明运行时会发生什么。这将使我们能够专注于执行阶段,而不是规划阶段。
FROM employees
| LOOKUP JOIN departments ON dep_id
| KEEP last_name, dep_name, dep_location
逻辑计划(logical plan)是一个表示数据流和必要转换的树状结构,是上述查询翻译后的结果。这个逻辑计划以查询的语义为核心。
为了确保高效扩展,标准的 Elasticsearch 索引会被分成多个分片,并分布在整个集群中。在 join 场景中,如果左侧 (L) 和右侧 (R) 都进行分片,将会产生 L*R 个分区。为了尽量减少数据移动的需求,lookup join 要求右侧(提供增强数据的一方)只有一个分片,类似于 enrich 索引,其副本数量由索引设置决定(默认是 1)。
这减少了执行 join 所需的节点数量,从而缩小了问题空间。因此,LR 变为 L1,也就是 L。
因此,协调节点只需将计划分发到左侧的数据节点,在本地使用 lookup(右侧)索引执行 hash join,通过右侧构建底层哈希映射,而左侧则用于批量 “探测” 匹配的键。
生成的分布式物理计划(physical plan),专注于查询的分布式执行,结构如下:
该计划由两个主要部分或子计划组成:一个是在协调节点上执行的物理计划(通常是接收并负责完成查询的节点),另一个是计划片段,在数据节点(存储数据的节点)上执行。由于协调节点本身不包含数据,它会将一个计划片段发送到相关的数据节点进行本地执行。执行结果随后会返回给协调节点,由其计算最终结果。
两个实体之间的通信通过 Exchange 块在计划中表示。对于这个查询来说,协调节点的工作量不大,因为大部分处理都发生在数据节点上。
该片段封装了逻辑子计划,从而可以根据每个分片数据的具体特性进行优化(例如缺失字段、本地的最小值和最大值)。这种本地重新规划还有助于在节点间或节点与协调节点之间的代码存在差异(例如在集群升级期间)时进行管理。
本地物理计划(local physical plan)大致如下:
该计划旨在通过高效的数据提取方式减少 I/O。树底部的两个节点作为根节点,为上层节点提供数据。每个节点输出对底层 Elasticsearch 文档(doc_id)的引用。这种设计是有意为之,用于尽可能延迟加载列(字段)或文档,直到通过指定的提取节点(图中为黄色)进行处理。在这个特定的计划中,加载操作发生在执行每一侧 hash join 之前,以及最终 project 操作之前,此时仅使用 join 后的结果数据将其输出到节点之外。
未来工作
限定符 - Qualifiers
目前,lookup join 的语法要求两个表中的键名称相同(类似于某些 SQL 方言中的 JOIN USING)。这个限制可以通过 RENAME 或 EVAL 来解决:
FROM employees_new
| RENAME dep AS dep_id // align the names of the group key
| LOOKUP JOIN departments ON dep_id
这是一个不必要的不便,我们正在通过引入(源)限定符在不久的将来解决这个问题。
之前的查询可以重写为(语法正在开发中):
FROM employees_new e
| LOOKUP JOIN departments ON e.dep == departments.dep_id
请注意,join key 被替换为一个等式比较,其中每一侧都使用字段名称限定符,限定符可以是隐式的(departments)或显式的(e)。
更多连接类型和性能
我们目前正在改进 lookup join 算法,以更好地利用数据拓扑,专注于利用 Lucene 中的底层搜索结构和统计信息进行数据跳过的优化。
从长远来看,我们计划支持更多的连接类型,如内连接(或交集,结合两侧具有相同字段的文档)和全外连接(或并集,即使没有共同键,也结合两侧的文档)。
反馈
Elasticsearch 对原生 JOIN 支持的道路漫长,追溯到 0.90 版本。早期的尝试包括 nested 和 _parent
字段类型,后者最终在 2.0 版本中被重写,在 5.0 版本中被弃用,并在 6.0 版本中由 join 字段替代。
更近期的功能,如 Transforms(7.3)和 Enrich 数据摄取管道(7.5)也旨在解决类似连接的用例。在更广泛的 Elasticsearch 生态系统中,Logstash 和 Apache Spark(通过 ES-Hadoop 连接器)提供了替代解决方案。Elasticsearch SQL,自 6.3.0 版本推出以来,也值得一提,因为其语法相似:虽然它支持广泛的 SQL 功能,但原生 JOIN 支持一直没有实现。
所有这些解决方案都有效并继续得到支持。然而,我们认为,ES|QL 由于其查询语言和执行引擎,显著简化了用户体验!
ESQL Lookup join 目前处于技术预览阶段,在 Elasticsearch 8.18 和 Elastic Cloud 中免费提供 —— 试试看,并告诉我们它对你有何帮助!
Elasticsearch 拥有众多新功能,帮助你为你的用例构建最佳搜索解决方案。深入了解我们的示例笔记本,开始免费云试用,或立即在本地机器上试用 Elastic。
原文:Native joins available in Elasticsearch 8.18 - Elasticsearch Labs
相关文章:
Elasticsearch 8.18 中提供了原生连接 (Native Joins)
作者:来自 Elastic Costin Leau 探索 LOOKUP JOIN,这是一条在 Elasticsearch 8.18 的技术预览中提供的新 ES|QL 命令。 很高兴宣布 LOOKUP JOIN —— 这是一条在 Elasticsearch 8.18 的技术预览中提供的新 ES|QL 命令,旨在执行左 joins 以进行…...
在线终端(一个基于 Spring Boot 的在线终端模拟器,实现了类 Linux 命令行操作功能)
Online Terminal 一个基于 Spring Boot 的在线终端模拟器,实现了类 Linux 命令行操作功能。 功能特点 模拟 Linux 文件系统操作支持基础的文件和目录管理命令提供文件内容查看和编辑功能支持文件压缩和解压缩操作 快速开始 环境要求 JDK 8Maven 3.6 运行项目 克隆项目到…...
vue+electron ipc+sql相关开发(三)
在 Electron 中使用 IPC(Inter-Process Communication)与 SQLite 数据库进行通信是一个常见的模式,特别是在需要将数据库操作从渲染进程(Vue.js)移到主进程(Electron)的情况下。这样可以更好地管理数据库连接和提高安全性。下一篇介绍结合axios写成通用接口形式,虽然没…...
C++静态变量多线程中的未定义行为
静态变量,是 C 程序员最早接触的语言特性之一。它有状态、生命周期长、初始化一次,用起来真是香。 但只要程序一旦进入多线程的世界,很多你原以为“稳定可靠”的写法,可能就突然开始“不对劲”了。静态变量首当其冲。 今天我们就…...
黑马商城项目(二) Docker
一、Docker快速入门 安装Docker - 飞书云文档 二、命令解读 常见命令: 数据卷: 案例1 数据卷挂载: 案例2 本地目录挂载: 挂载到指定目录能够保存数据(即使Mysql容器被删除) docker run -d \--name mysql …...
玩转Docker | 使用Docker部署Memos笔记工具
玩转Docker | 使用Docker部署Memos笔记工具 前言一、Memos介绍Memos简介主要特点二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署Memos服务下载镜像创建容器创建容器检查容器状态检查服务端口安全设置四、访问Memos服务访问Memos首页注册账号五、基本使用…...
c#从ftp服务器下载文件读取csv
从 FTP 服务器下载文件的功能,并且支持根据文件名称的前缀或直接文件名进行查找和下载。以下是对代码的一些建议和修改,以确保它能够满足您的需求,尤其是如果您希望仅下载特定类型的文件(例如 .csv 文件) using Syste…...
电脑知识 | TCP通俗易懂详解 <三>tcp首部中ACK、SYN、FIN等信息填写案例_握手时
目录 一、👋🏻前言 二、🤝🏻握手时的快递单 1.👫第一次握手(发送方) 2.👫第二次握手(收件方) 3.👫第三次握手(发件方)…...
go学习记录(第二天)
Java里面的类对象可以对应go里面的结构体吗 表格对比 Java 类 (Class)Go 结构体 (Struct)封装数据和行为(字段方法)主要封装数据(字段),方法通过接收者关联支持继承(extends…...
Docker 中启动 Nginx 容器
文章目录 1. 快速运行 Nginx 容器从 Docker Hub 拉取官方镜像并运行:验证访问: 2. 挂载自定义配置和静态文件步骤: 3. 常用操作命令4. 生产环境建议使用 Docker Compose关键优化: 5. 调试技巧6. 常见问题解决 1. 快速运行 Nginx 容…...
windows 11 安装 redis
在 Windows 11 上安装 Redis 可以采用几种不同的方法,这里介绍几种常见的方法: 方法 1:使用 Microsoft Store Windows 11 提供了 Microsoft Store,你可以直接从那里安装 Redis。 打开 Microsoft Store。 在搜索框中输入 “Redi…...
5. k8s 之 pod原理与使用
Kubernetes Pod 原理详解 1. Pod 的部署方式 Pod 是 Kubernetes 的最小调度单元,其部署方式分为 声明式(YAML) 和 命令式(kubectl) 两种: (1) 声明式部署(推荐) 通过 YAML 文件定…...
人形机器人动作策略 ∼ 人类动作策略
25年3月来自UCSD、CMU、西雅图 UW、MIT 和 Apple 公司的论文“Humanoid Policy ∼ Human Policy”。 利用多样化数据训练人形机器人的操作策略,可以增强其在跨任务和平台的鲁棒性和泛化能力。然而,仅从机器人演示中学习需要耗费大量的人力,需…...
MySQL事务详解:从5.7到8.0的变化
MySQL事务详解:从5.7到8.0的变化 引言 在关系型数据库管理系统(RDBMS)中,事务是一个核心概念,它确保了数据的一致性和可靠性。MySQL作为最流行的开源RDBMS之一,其事务处理机制在不同的版本中经历了重要的…...
conda常用命令简解
以下是conda常用命令的汇总: 创建一个新环境: conda create -n your_env_name pythonX.X 激活某个环境: activate your_env_name 安装包: conda install [package] 查看安装了哪些包: conda list 查看当前有哪些虚拟环境&…...
数据科学与机器学习:前沿技术研究
数据科学与机器学习:前沿技术研究 摘要 本文探讨了数据科学与机器学习领域的三个前沿方向:自适应机器学习模型、联邦学习隐私与保护以及多模态数据处理。通过理论分析、算法设计和实验验证,展示了这些技术在解决实际问题中的潜力和挑战。自适应机器学习模型能够根据数据变化…...
个人博客测试报告
作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 🎂 作者介绍: 🎂🎂 🎂 🎉🎉🎉…...
Sentinel源码—3.ProcessorSlot的执行过程一
大纲 1.NodeSelectorSlot构建资源调用树 2.LogSlot和StatisticSlot采集资源的数据 3.Sentinel监听器模式的规则对象与规则管理 4.AuthoritySlot控制黑白名单权限 5.SystemSlot根据系统保护规则进行流控 1.NodeSelectorSlot构建资源调用树 (1)Entry的处理链的执行入口 (2…...
datagrip连接mysql问题5.7.26
1.Case sensitivity: plainmixed, delimitedexac Remote host terminated the handshake. 区分大小写:plain混合,分隔exac 远程主机终止了握手。 原因:usessl 参数用于指定是否使用 SSL(Secure Sockets Layer)加密来保护数据传…...
【电路笔记】-变压器构造
变压器构造 文章目录 变压器构造1、概述2、变压器铁芯的构造3、变压器叠片4、变压器绕组排列5、变压器点定位6、变压器铁芯损耗6.1 磁滞损耗6.2 涡流损耗6.3 铜损耗一个简单的双绕组变压器构造包括每个绕组分别缠绕在一个独立的软铁肢或磁芯上,这提供了必要的磁路。 1、概述 …...
阿里云集群开启debug
1、安装 kubectl Macos brew install kubectl Windows: https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-windows/ 下载后,放到任意目录 2、配置连接信息 mac 将以下内容复制到计算机 $HOME/.kube/config 文件下: windows 不同集…...
继承-C++
继承在我们日常中经常指我们的人伦关系中的父子关系,孩子继承父母的基因、习惯之类的,孩子也会有自己的个性等。然而在我们C计算机语言中的类也存在继承,我们将作为“父亲”的类称为父类,将作为“孩子”的类称为子类,父…...
Java并发-AQS框架原理解析与实现类详解
什么是AQS? AQS(AbstractQueuedSynchronizer)是Java并发包(JUC)的核心基础框架,它为构建锁和同步器提供了高效、灵活的底层支持。本文将从设计原理、核心机制及典型实现类三个维度展开,帮助读者…...
【FFmpeg从入门到精通】第一章-FFmpeg简介
1 FFmpeg的定义 FFmpeg既是一款音视频编解码工具,同时也是一组音视频编解码开发套件,作为编解码开发套件,它为开发者提供了丰富的音视频处理的调用接口。 FFmpeg提供了多种媒体格式的封装和解封装,包括多种音视频编码、多种协议…...
Mac屏幕共享怎么使用?
Mac电脑要实现远程桌面连接到的工功能,可以使用其自带的屏幕共享功能。Mac屏幕共享能从一台Mac电脑远程控制另一台Mac电脑,并且无需下载第三方远程控制软件。下面,将为您介绍Mac远程桌面连接在哪,以及使用方法。 步骤 1. Mac的远…...
探索亮数据Web Unlocker API:让谷歌学术网页科研数据 “触手可及”
本文目录 一、引言二、Web Unlocker API 功能亮点三、Web Unlocker API 实战1.配置网页解锁器2.定位相关数据3.编写代码 四、Web Scraper API技术亮点 五、SERP API技术亮点 六、总结 一、引言 网页数据宛如一座蕴藏着无限价值的宝库,无论是企业洞察市场动态、制定…...
【后端】【python】利用反射器----动态设置装饰器
📘 Python 装饰器进阶指南 一、装饰器本质 ✅ 本质概念 Python 装饰器的本质是 函数嵌套 返回函数,它是对已有函数的增强,不修改原函数代码,使用语法糖 decorator 实现包裹效果。 def my_decorator(func):def wrapper(*args, …...
Oracle 中的 NOAUDIT CREATE SESSION 命令详解
Oracle 中的 NOAUDIT CREATE SESSION 命令详解 NOAUDIT CREATE SESSION 是 Oracle 数据库中用于取消对用户登录会话审计的命令,它与 AUDIT CREATE SESSION 命令相对应。 一、基本语法 NOAUDIT CREATE SESSION [BY user1 [, user2]... | BY [SESSION | ACCESS]] …...
《Chronos: Learning the Language of Time Series》
全文摘要 本文提出了Chronos,一个简单而有效的预训练概率时间序列模型框架。Chronos通过缩放和量化将时间序列值标记化为固定词汇,并利用现有的基于变换器的语言模型架构进行训练。我们在多个公开数据集和合成数据集上预训练了Chronos模型,并…...
git UserInterfaceState.xcuserstate 文件频繁更新
1> 退出 Xcdoe,打开终端(Terminal),进入到你的项目目录下。 2> 在终端键入 git rm --cached <YourProjectName>.xcodeproj/project.xcworkspace/xcuserdata/<YourUsername>.xcuserdatad/UserInterfaceState.x…...
Day92 | 灵神 | 二叉树 路径总和
Day92 | 灵神 | 二叉树 路径总和 112.路径总和 112. 路径总和 - 力扣(LeetCode) 思路: 1.递归函数意义 如果在根节点为t的树中可以找到长度为target的路径就返回true,找不到就返回false 2.参数和返回值 bool tra(TreeNode …...
数据集 handpose_x_plus 3D RGB 三维手势 - 打篮球 场景 play basketball
数据集 handpose 相关项目地址:https://github.com/XIAN-HHappy/handpose_x_plus 样例数据下载地址:数据集handpose-x-plus3DRGB三维手势-打篮球场景playbasketball资源-CSDN文库...
GitLab本地安装指南
当前GitLab的最新版是v17.10,安装地址:https://about.gitlab.com/install/。当然国内也可以安装极狐GitLab版本,极狐GitLab 是 GitLab 中国发行版(JH)。极狐GitLab支持龙蜥,欧拉等国内的操作系统平台。安装…...
云数据库:核心分类、技术优势与创新、应用场景、挑战应对和前沿趋势
李升伟 整理 云数据库技术是云计算与数据库技术融合的产物,它通过云服务模式提供数据库功能,彻底改变了数据的存储、管理和访问方式。以下从核心概念、技术优势、应用场景及挑战等方面展开分析: 一、云数据库的核心分类 按部署模式 托管数…...
算力狂飙时代:解码2024年上海及周边区域IDC市场的三重构局
2025年3月,科智咨询《2024-2025年上海及周边地区IDC市场研究报告》正式发布。报告对上海及周边地区IDC市场发展情况进行全面分析与深入解读。 在长三角地区数字经济蓬勃发展的背景下,上海及周边区域的数据中心产业正迎来深刻转型。随着上海市政府陆续出台…...
循环首差链码的通俗解释
循环首差链码的通俗解释 1. 链码是什么? 链码是一种用数字序列描述图像中物体轮廓的方法。例如,在 4-链码 中: 0 表示向右移动;1 表示向上移动;2 表示向左移动;3 表示向下移动。 假设有一段轮廓的链码为…...
✅ MySQL 事务 MVCC ROLLBACK
🧠 一、MVCC 与可重复读(REPEATABLE READ) 项目内容MVCC 概念多版本并发控制,事务中读到的是开启事务时的数据快照实现机制依赖 Read View trx_id Undo Log 实现版本判断快照读普通 SELECT,使用 MVCC,不…...
信息系统项目管理工程师备考计算类真题讲解四
一、三点估算(PERT) PERT(Program Evaluation and Review Technique):计划评估技术,又称三点估算技术。PERT估算是一种项目管理中用于估算项目工期或成本的方法,以下是其详细介绍: …...
winfrom 查询某字符串 找到它在 richTextbox 的位置 定位 并高亮 并且滚动定位到所查询的字符串所在的行
如图: 代码: //查找关键字private void buttonSearch_Click(object sender, EventArgs e){string searchText textBoxSearch.Text;if (!string.IsNullOrEmpty(searchText)){TextBoxFinds(txtJSON, searchText);TextBoxFinds(txtSQL, searchText);}}//查…...
数据结构学习笔记 :线性表的链式存储详解
目录 单链表 1.1 无头单链表 1.2 有头单链表单向循环链表双链表 3.1 双链表 3.2 双向循环链表总结与对比 一、单链表 1. 无头单链表(Headless Singly Linked List) 定义:链表无头结点,直接由头指针指向第一个数据节点。 特点&…...
MyBatis-Plus 详解:快速上手到深入理解
一、前言 🌟 🧩 MyBatis & MyBatis-Plus 是啥关系? MyBatis 是一个优秀的 ORM 框架(Object Relational Mapping,面向对象关系映射),它让我们可以通过编写 SQL 来操作数据库,同…...
【软件工程大系】净室软件工程
净室软件工程(Cleanroom Software Engineering)是一种以缺陷预防(正确性验证)为核心的软件开发方法,旨在通过严格的工程规范和数学验证,在开发过程中避免缺陷的产生,而非依赖后期的测试和调试。…...
[区块链lab2] 构建具备加密功能的Web服务端
实验目标: 掌握区块链中密码技术的工作原理。在基于Flask框架的服务端中实现哈希算法的加密功能。 实验内容: 构建Flash Web服务器,实现哈希算法、非对称加密算法的加密功能。 实验步骤: 哈希算法的应用:创建hash…...
2025年- H10-Lc117-560.和为K的子数组(子串)--java版
1.题目描述 2.思路 例子1: 3.代码实现 class Solution {public int subarraySum(int[] nums, int k) {// List<Integer> listnew ArrayList<>();// int cnt0;// for(int i0;i<nums.length;i)// {// for(int ji1;j<nums.length;j)// {// …...
肾脏系统触发 “元数据泄漏警报“(蛋白尿+)
肾脏系统触发 "元数据泄漏警报"(蛋白尿) 核心故障模块:肾小球滤过屏障(GlomerularFilter v2.5.0) 漏洞类型:孔径屏障漏洞 电荷屏障校验失败 → 元数据(蛋白质)越界泄漏 …...
摄像头的工作原理与应用摄像头的工作原理与应用
一、摄像头的工作原理与应用 基本概念 V4L2的全称是Video For Linux Two,其实指的是V4L的升级版,是linux系统关于视频设备的内核驱动,同时V4L2也包含Linux系统下关于视频以及音频采集的接口,只需要配合对应的视频采集设备就可以…...
一个由通义千问以及FFmpeg的AVFrame、buffer引起的bug:前面几帧影响后面帧数据
目录 1 问题描述 2 我最开始的代码----错误代码 3 正确的代码 4 为什么前面帧的结果会叠加到了后面帧上----因为ffmpeg新一帧只更新上一帧变化的部分 5 以后不要用通义千问写代码 1 问题描述 某个项目中,需要做人脸马赛克,然后这个是君正的某款芯片…...
MyBatis-动态SQL
MyBatis Plus 作为 MyBatis 的增强工具,简化了 CRUD 操作,但在复杂查询时,仍需使用 MyBatis 的动态 SQL 功能。以下是一些常用的动态标签、用法示例及注意事项: 常用动态标签及用法示例 <if> 标签 用途:条件判…...
顺序表(Arraylist)和链表(Linkedlist)
List List是一个接口,继承自Collection。 从数据结构角度来说,List就是一个线性表,即用n个相同类型的有限序列,可以在此序列中可以进行增删改查操作。 List是接口不能直接实例化,Linkedlist和Arraylist都实现了List…...
【python】django sqlite版本过低怎么办
方法一:下载最新版本 复制上面的内容的链接 在服务器上进行操作 wget https://sqlite.org/2025/sqlite-autoconf-3490100.tar.gz tar -zxvf sqlite-autoconf-3490100.tar.gz cd sqlite-autoconf-3490100 ./configure --prefix/usr/local make && make in…...