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 以进行…...
java CountDownLatch用法简介
CountDownLatch倒计数锁存器 CountDownLatch:用于协同控制一个或多个线程等待在其他线程中执行的一组操作完成,然后再继续执行 CountDownLatch用法 构造方法:CountDownLatch(int count),count指定等待的条件数(任务…...
k8s蓝绿发布
k8s蓝绿发布 什么是蓝绿部署K8S中如何实现蓝绿部署k8s蓝绿部署流程图 什么是蓝绿部署 参考: https://youtu.be/CLq_hA0lAd0 https://help.coding.net/docs/cd/best-practice/blue-green.html 蓝绿部署最早是由马丁福勒 2010年在他的博客中提出. 蓝绿部署是一种软件部署策略,用…...
链接世界:计算机网络的核心与前沿
计算机网络引言 在数字化时代,计算机网络已经成为我们日常生活和工作中不可或缺的基础设施。从简单的局域网(LAN)到全球互联网,计算机网络将数以亿计的设备连接在一起,推动了信息交换、资源共享以及全球化的进程。 什…...
记录Docker部署CosyVoice V2.0声音克隆
#记录工作 CosyVoice 是由 FunAudioLLM 团队开发的一个开源多语言大规模语音生成模型,提供了从推理、训练到部署的全栈解决方案。 项目地址: https://github.com/FunAudioLLM/CosyVoice.git 该项目目前从v1.0版本迭代到v2.0版本,但是在Wind…...
MCU刷写——HEX与S19文件互转详解及Python实现
工作之余来写写关于MCU的Bootloader刷写的相关知识,以免忘记。今天就来聊聊Hex与S19这这两种文件互相转化,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走…...
全链路开源数据平台技术选型指南:六大实战工具链解析
在数字化转型加速的背景下,开源技术正重塑数据平台的技术格局。本文深度解析数据平台的全链路架构,精选六款兼具创新性与实用性的开源工具,涵盖数据编排、治理、实时计算、联邦查询等核心场景,为企业构建云原生数据架构提供可落地…...
C++学习:六个月从基础到就业——面向对象编程:封装、继承与多态
C学习:六个月从基础到就业——面向对象编程:封装、继承与多态 本文是我C学习之旅系列的第九篇技术文章,主要讨论C中面向对象编程的三大核心特性:封装、继承与多态。这些概念是理解和应用面向对象设计的关键。查看完整系列目录了解…...
Golang Event Bus 最佳实践:使用 NSQite 实现松耦合架构
Go Event Bus 最佳实践:使用 NSQite 实现松耦合架构 什么是 Event Bus? Event Bus(事件总线)是一种消息传递模式,它允许应用程序的不同组件通过发布/订阅机制进行通信,而不需要直接相互依赖。这种模式特别…...
独家!美团2025校招大数据题库
推荐阅读文章列表 2025最新大数据开发面试笔记V6.0——试读 我的大数据学习之路 面试聊数仓第一季 题库目录 Java 1.写一个多线程代码 2.写一个单例代码 3.LinkedBlockingQueue原理 4.模板设计模式 5.如何设计一个 生产者-消费者队列 6.堆内存和栈内存 7.ThreadLo…...
用 C++ 模拟客户端渲染中的分步数据加载
用 C++ 模拟客户端渲染中的分步数据加载 引言 在前端开发中,客户端渲染是一种常见的技术,它允许页面在加载后动态地更新内容。通常,页面会先展示一个基本的骨架,然后再逐步加载和渲染具体的数据。本文将介绍如何使用 C++ 编写一个简单的程序来模拟客户端渲染中的这种分步…...
Dify智能体平台源码二次开发笔记(5) - 多租户的SAAS版实现(2)
目录 前言 用户的查询 controller层 添加路由 service层 用户的添加 controller层 添加路由 service层-添加用户 service层-添加用户和租户关系 验证结果 结果 前言 完成租户添加功能后,下一步需要实现租户下的用户管理。基础功能包括:查询租…...
Linux的目录结构(介绍,具体目录结构)
目录 介绍 具体目录结构 简洁的目录解释 详细的目录解释 介绍 Linux的文件系统是采用级层式的树状目录结构,在此结构的最上层是根目录“/”。Linux的世界中,一切皆文件(比如:Linux会把硬件映射成文件来管理) 具体目…...
如何用 esProc 补充数据库 SQL 的缺失能力
某些数据库 SQL 缺失必要的能力,通常要编写大段的代码,才能间接实现类似的功能,有些情况甚至要改用存储过程,连结构都变了。常见的比如:生成时间序列、保持分组子集、动态行列转换、自然序号、相对位置、按序列和集合生…...
晶晨线刷工具下载及易错点说明:Key文件配置错误/mac剩余数为0解决方法
晶晨线刷工具下载及易错点说明:Key文件配置错误/mac剩余数为0解决方法 各种版本晶晨线刷工具下载: 晶晨线刷工具易出错点故障解决方法: 1、晶晨线刷工具加载固件的时候提示mac红字且剩余数为0的解决办法 很多同学可能会与遇到加…...
论文阅读:Invertible Grayscale
这是一篇 ACM Transactions on Graphic 上的文章,这篇文章中介绍的应用还挺有意思的,关于可逆的图像灰度化。 Abstract 一旦彩色图像被转换为灰度图像,人们普遍认为,即使采用最先进的彩色化方法,原始颜色也无法完全恢…...
linux下使用php修改php.ini的session.save_path无效的解决办法
linux下安装php的组合还是php-fpm和nginx,其实已经安装好了,网站已经能够跑起来了,但是遇到后台登录的时候验证码一直不对,看了下报错,session无法存储,于是新增了一个phpinfo文件,使用web查看下…...
关于ResNet和FPN的一份介绍
在这篇文章中我将介绍ResNet和FPN这两个深度学习中重要的技术。 一、ResNet-50/101 首先我们先来看ResNet技术: 1.1 概述 ResNet技术是基于残差学习,引入Bottleneck技术以及Shortcut Connection技术,而去解决神经网络中的退化问题。 1.2…...
以技术的形式实现发票真伪的快速查验-Android发票查验接口
对于企业而言,假票入账不仅可能导致企业财务损失,更会引发一系列法律风险,因此精准、高效的发票查验服务成为了企业运营不可或缺的支持。发票验真服务接口,正是一款能满足这些需求,助力企业摆脱繁琐流程、提升工作效率…...
Python实现贪吃蛇三
上篇文章Python实现贪吃蛇一,实现了一个贪吃蛇的基础版本。后面第二篇文章Python实现贪吃蛇二修改了一些不足,但最近发现还有两点需要优化: 1、生成食物的时候有概率和记分牌重合 2、游戏缺少暂停功能 先看生成食物的时候有概率和记分牌重合的…...
Docker 中多个容器之间的通信
在 Docker 中,多个容器之间的通信可以通过以下几种主要方式实现,具体选择取决于网络需求、隔离性及管理复杂度: 一、自定义 Bridge 网络(推荐) 通过创建自定义的 Docker 网络,容器可以加入同一网络并通过容…...
AI大模型学习九:Sealos cloud+k8s云操作系统私有化一键安装脚本部署完美教程
一、说明 Sealos是一款基于Kubernetes(K8s)的云操作系统发行版,它将K8s以及常见的分布式应用如Docker、Dashboard、Ingress等进行了集成和封装,使得用户可以在不深入了解复杂的K8s底层原理的情况下,快速搭建起一个…...
详解关于VS配置好Qt环境之后但无法打开ui界面
目录 找到Qt安装目录中designer.exe的路径 找到vs中的解决方案资源管理器 右键ui文件,找到打开方式 点击添加 然后把前面designer.exe的路径填到程序栏中,点击确定 然后设置为默认值,并点击确定 当在vs中配置好Qt环境之后,但…...
Python Cookbook-6.5 继承的替代方案——自动托管
任务 你需要从某个类或者类型继承,但是需要对继承做一些调整。比如,需要选择性地隐藏某些基类的方法,而继承并不能做到这一点。 解决方案 继承是很方便的,但它并不是万用良药。比如,它无法让你隐藏基类的方法或者属…...
【深度学习与大模型基础】第9章-条件概率以及条件概率的链式法则
简单理解条件概率 条件概率就是在已知某件事发生的情况下,另一件事发生的概率。用数学符号表示就是: P(A|B) 在B发生的前提下,A发生的概率。 计算机例子:垃圾邮件过滤 假设你写了一个程序来自动判断邮件是否是垃圾邮件…...
STM32-FreeRTOS的详细配置
配置FreeRTOS 原文链接:https://ydamooc.github.io/posts/c9defcd/ 1.1 下载FreeRTOS 打开FreeRTOS官网:https://www.freertos.org/ 点击下载,并且选择"FreeRTOS 202212.01"版本,再点击Download按钮下载官方的资源包…...
行为检测技术指南
以下是行为检测技术的全面技术指南,涵盖核心技术原理、应用场景及发展趋势: 一、核心行为检测技术分类 1. 基于计算机视觉的行为检测 目标检测算法 通过目标定位与分类识别行为,典型算法包括: YOLO系列(YOLOv5/v8):实时性强,适用于视频流中的动作识别(如摔倒、抽烟检…...
视觉自回归图像生成:基于多模态大模型的万字深度梳理
目前利用多模态大模型进行图像生成主要有以下两种形式: LLM作为condtioner:利用MLLM依据用户输入的text prompt来生成条件信息,条件信息被注入到下游生成模型进行更精细化的生成控制。这种形式通常需要外接一个额外专门的多模态生成模型&…...
openssh离线一键升级脚本分享(含安装包)
查看当前的版本 [rootmyoracle ~]#ssh -V相关安装包下载地址 openssh下载地址:http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssl下载地址:https://www.openssl.org/source/zlib下载地址:http://www.zlib.net/今天演示从7.4升级…...
音视频之H.265/HEVC预测编码
H.265/HEVC系列文章: 1、音视频之H.265/HEVC编码框架及编码视频格式 2、音视频之H.265码流分析及解析 3、音视频之H.265/HEVC预测编码 预测编码是视频编码中的核心技术之一。对于视频信号来说,一幅图像内邻近像素之间有着较强的空间相关性,相邻图像之…...
