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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/77720.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/77720.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/77720.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2025年滲透測試面試題總結-拷打題庫03(題目+回答)

網絡安全領域各種資源,學習文檔,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具,歡迎關注。 目錄 2025年滲透測試面試題總結-拷打題庫03 一、Windows與Linux系統提權思路 Windows提權 Linux提權 二、…

【華為】OSPF震蕩引起CPU占用率高怎么解決?

原創:廈門微思網絡 現象描述 如圖所示,Switch_1、Switch_2、Switch_3和Switch_4配置了OSPF協議,發現Switch_1設備的CPU占用率高,ROUT任務占用率明顯高于其他任務并且產生路由震蕩。 故障組網圖 原因分析 網絡中IP地址沖突導致…

Everything 安裝教程與使用教程(附安裝包)

文章目錄 前言一、Everything 介紹二、Everything 安裝教程1.Everything 安裝包下載2.選擇安裝文件3.選擇安裝語言4.接受許可協議5.選擇安裝位置6.配置安裝選項7.完成安裝 三、Everything 使用教程1.啟動軟件2.簡單關鍵詞搜索3.按類型搜索 前言 在日常使用電腦時,隨…

極狐GitLab CI/CD 流水線計算分鐘數如何管理?

極狐GitLab 是 GitLab 在中國的發行版,關于中文參考文檔和資料有: 極狐GitLab 中文文檔極狐GitLab 中文論壇極狐GitLab 官網 計算分鐘管理 (PREMIUM SELF) 在極狐GitLab 16.1 中,從 CI/CD 分鐘數重命名為計算配額或計算分鐘數。 管理員可…

Containerd 1.7.2 離線安裝與配置全指南(生產級優化)

Containerd 1.7.2 離線安裝與配置全指南(生產級優化) 摘要:本文詳細講解在無外網環境下部署 Containerd 1.7.2 容器運行時的完整流程,涵蓋二進制包安裝、私有鏡像倉庫配置、Systemd服務集成等關鍵步驟,并提供生產環境…

33-公交車司機管理系統

技術: 基于 B/S 架構 SpringBootMySQLvueelementui 環境: Idea mysql maven jdk1.8 node 用戶端功能 1.首頁:展示車輛信息及車輛位置和線路信息 2.模塊:車輛信息及車輛位置和線路信息 3.公告、論壇 4.在線留言 5.個人中心:修改個人信息 司機端功能…

基于 OpenCV 的圖像與視頻處理

基于 OpenCV 的圖像處理 一、實驗背景 OpenCV 是一個開源的計算機視覺庫,廣泛應用于圖像處理、視頻分析、目標檢測等領域。通過學習 OpenCV,可以快速實現圖像和視頻的處理功能,為復雜的應用開發 奠定基礎。本實驗旨在通過實際代碼示例&…

Linux 常用指令用戶手冊

Linux 常用指令用戶手冊 適合新手入門 & 日常速查 目錄 基礎操作文件與目錄管理權限與所有權文本處理壓縮與解壓系統監控網絡操作進程管理實用小技巧 1. 基礎操作 1.1 查看系統信息 # 查看內核版本 uname -a# 查看系統發行版信息(適用于 Debian/Ubuntu&…

長效IP與短效IP:如何選擇適合業務的代理類型

在當今數據驅動的互聯網環境中,代理IP已成為企業運營、數據采集和網絡安全的關鍵工具。其中長效IP與短效IP作為兩種主流代理類型,因特性差異被應用于不同場景。本文將深入解析二者的區別,并提供實際場景中的選擇建議。 一、長效IP與短效IP&a…

數據結構|排序算法(三)選擇排序 堆排序 歸并排序

一、選擇排序 1.算法思想 選擇排序(Selection Sort)是一種簡單直觀的排序算法,其基本思想是:每次都從待排序部分中選出最小的一個數據和待排序的第一個數據交換。 將待排序序列分為已排序和未排序兩部分,初始時已排…

Vue3 + TypeScript,關于item[key]的報錯處理方法

處理方法1:// ts-ignore 注釋忽略報錯 處理方法2:item 設置為 any 類型

8.觀察者模式:思考與解讀

原文地址:觀察者模式:思考與解讀 更多內容請關注:7.深入思考與解讀設計模式 引言 在開發軟件時,系統的某些狀態可能會發生變化,而你希望這些變化能夠自動通知到依賴它們的其他模塊。你是否曾經遇到過,系統中某個對象…

【HD-RK3576-PI】Ubuntu桌面多顯、旋轉以及更新Logo

硬件:HD-RK3576-PI 軟件:Linux6.1Ubuntu22.04 在基于HD-RK3576-PI硬件平臺運行Ubuntu 22系統的開發過程中,屏幕方向調整是提升人機交互體驗的關鍵環節。然而,由于涉及uboot引導階段、內核啟動界面、桌面環境顯示全流程適配&#x…

Rsync+sersync2實現目錄實時同步

Sersync rsync 實現實時同步服務 sersync2二進制包目錄規劃 /app/tools/sersync/ /app/tools/sersync/bin /app/tools/sersync/conf項目架構是這樣的: ------------------- ------------------- ------------------- | | …

MySQL視圖高級應用與最佳實踐

1. 視圖與索引的協同優化?? ??物化視圖(模擬實現)?? MySQL原生不支持物化視圖,但可通過“定時刷新”的物理表模擬: -- 1. 創建存儲結果的物理表 CREATE TABLE cached_monthly_sales (product_id INT,total_sales DECIMAL(10…

string的模擬實現 (6)

目錄 1.string.h 2.string.cpp 3.test.cpp 4.一些注意點 本篇博客就學習下如何模擬實現簡易版的string類&#xff0c;學好string類后面學習其他容器也會更輕松些。 代碼實現如下&#xff1a; 1.string.h #define _CRT_SECURE_NO_WARNINGS 1 #pragma once #include <…

Unity:像素(Pixels) 和 單位(Units)

目錄 從第一性原理出發&#xff1a;什么是像素和 Unit&#xff1f; &#x1f9f1; 1. 像素&#xff08;Pixel&#xff09;&#xff1a;圖像的最小單位 &#x1f4d0; 2. Unity Unit&#xff08;單位&#xff09;&#xff1a;游戲世界中的度量單位 核心換算公式&#xff1a;…

【失敗總結】Win10系統安裝docker

1.啟用或關閉windows功能中&#xff0c;將Hyper-V功能勾選全部啟用&#xff0c;容器勾選。設置好后要重啟電腦。 2.管網下載下載安裝Docker  Docker官網&#xff1a;https://www.docker.com/ 3.可以自定義Docker安裝路徑 新建安裝目錄&#xff1a;d:\MySoftware\Docker并將D…

《Adaptive Layer-skipping in Pre-trained LLMs》- 論文筆記

作者&#xff1a;Xuan Luo, Weizhi Wang, Xifeng Yan Department of Computer Science, UC Santa Barbara xuan_luoucsb.edu, weizhiwangucsb.edu, xyancs.ucsb.edu 1. 引言與動機 1.1 背景 LLM 的成功與挑戰: 大型語言模型 (LLMs) 在翻譯、代碼生成、推理等任務上取得巨大成…

DQN在Gym的MountainCar環境的實現

DQN on MountainCar 引言 在本次實驗里&#xff0c;我構建了DQN和Dueling DQN&#xff0c;并在Gymnasium庫的MountainCar環境中對它們展開測試。我通過調整訓練任務的超參數&#xff0c;同時設計不同的獎勵函數及其對應參數&#xff0c;致力于獲取更優的訓練效果。最后&#…