Elasticsearch父子關系解析

引言

在復雜業務場景中,數據關聯查詢是搜索與分析的核心需求。以電商訂單、文章評論、客戶關系等場景為例,傳統關系型數據庫通過外鍵實現的多表關聯,在分布式搜索場景下面臨性能與擴展性挑戰。Elasticsearch通過父子關系(Parent-Child Relationship)提供了一種高效的文檔級聯方案,支持靈活的多層數據建模與跨文檔查詢。

本文將以電商訂單管理為實例,詳解如何通過join字段實現父子文檔關聯,并結合has_parent/has_child查詢完成跨文檔檢索。無論您是優化數據結構設計,還是解決高并發場景下的關聯查詢性能問題,均可通過本文掌握Elasticsearch父子關系的核心配置技巧與最佳實踐。

父子關系

父子關系是一種在同一索引中將文檔建立關聯的方式。父子關系讓你能夠建立一種文檔間的層次結構,其中子文檔依賴于父文檔,類似于關系數據庫中的外鍵關系。在 Elasticsearch 中,父子關系的實現基于 nested type 和 join field(連接字段),并且需要啟用 parent-child relationship 的功能。

父子關系概念

  • 父文檔(Parent Document):是主文檔,通常是需要進行查詢和管理的核心數據。
  • 子文檔(Child Document):是從文檔,通常是依賴于父文檔的額外數據或詳細信息。

父子關系的應用場景

  • 一個訂單(父文檔)可以有多個訂單商品(子文檔)。
  • 一個客戶(父文檔)可以有多個訂單(子文檔)。
  • 一篇文章(父文檔)可以有多個評論(子文檔)。

舉例說明

總共創建了3個文檔,1 個父文檔(訂單),2 個子文檔(訂單商品)。這些文檔在同一個索引(ecommerce)中,但它們通過 父子關系 互相關聯。父文檔為 order 類型,子文檔為 order_item 類型,子文檔通過 parent 字段指向父文檔的 ID,從而建立了父子關系。

創建索引與映射

為 ecommerce 索引創建了一個 join 字段 relationship,并指定了父子關系:order 是父文檔,order_item 是子文檔。

PUT /ecommerce
{"mappings": {"properties": {"relationship": {"type": "join","relations": {"order": "order_item"  // order 是父文檔,order_item 是子文檔}},"order_id": {"type": "keyword"},"product_name": {"type": "text"},"quantity": {"type": "integer"},"price": {"type": "double"}}}
}

插入父文檔(訂單)

插入一個父文檔(訂單),它沒有任何子文檔。

POST /ecommerce/_doc/1
{"order_id": "ORD12345","relationship": {"name": "order"}
}

插入子文檔(訂單商品)

插入幾個子文檔(訂單商品)。子文檔需要指定 relationship 字段,指出它依賴的父文檔。子文檔 order_item 的 parent 字段指定了它所依賴的父文檔(訂單)的 ID。

POST /ecommerce/_doc/2
{"product_name": "Laptop","quantity": 1,"price": 1200.00,"relationship": {"name": "order_item","parent": "1"  // 指定父文檔的ID}
}POST /ecommerce/_doc/3
{"product_name": "Mouse","quantity": 2,"price": 25.50,"relationship": {"name": "order_item","parent": "1"   // 指定父文檔的ID}
}

查詢子文檔

使用 has_parent 查詢來獲取特定父文檔下的所有子文檔。例如,我們想查找訂單 ORD12345 下的所有商品。

GET /ecommerce/_search
{"query": {"has_parent": {"parent_type": "order",  // 父文檔類型"query": {"match": {"order_id": "ORD12345"  // 查詢父文檔 ID}}}}
}

查詢父文檔

使用 has_child 查詢來獲取某個子文檔下的父文檔。例如,我們想查找包含 Laptop 這一商品的訂單。

GET /ecommerce/_search
{"query": {"has_child": {"type": "order_item",  // 子文檔類型"query": {"match": {"product_name": "Laptop"  // 查詢子文檔的字段}}}}
}

感謝您的閱讀!如果文章中有任何問題或不足之處,歡迎及時指出,您的反饋將幫助我不斷改進與完善。期待與您共同探討技術,共同進步!

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

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

相關文章

MCP架構全解析:從核心原理到企業級實踐

💝💝💝歡迎蒞臨我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內容和知識,也可以暢所欲言、分享您的想法和見解。 推薦:「storms…

開發者體驗提升:打造高效愉悅的開發環境

“開發者體驗不是奢侈品,而是生產力的倍增器。優秀的工具鏈能讓開發者從機械勞動中解放,專注于創造真正有價值的東西。” —— 前端架構師 Sarah Drasner 1. 自定義 CLI 工具開發 (1) 基于 plop.js 的組件模板生成器 痛點分析:在大型項目中…

運用集合知識做斗地主案例

方法中可變參數 一種特殊形參,定義在方法,構造器的形參列表里,格式:數據類型...參數名稱; 可變參數的特點和好處 特點:可以不傳數據給它;可以傳一個或者同時傳多個數據給它;也可以…

websocket在vue中的使用步驟,以及實現聊天

一、WebSocket集成步驟 ?連接初始化? 在Vue組件中創建WebSocket實例,建議在mounted生命周期中執行: data() {return {socket: null,messages: []} }, mounted() {this.socket new WebSocket(wss://your-server-endpoint); }?事件監聽配置 ?連接成…

HarmonyOS鴻蒙Uniapp三方框架

鴻蒙Uniapp三方框架集成指南 一、環境配置 // 安裝必要依賴 npm install ohos/hvigor-ohos-plugin --save-dev // 配置harmony模塊 "harmony": {"compileSdkVersion": 9,"compatibleSdkVersion": 8,"arktsVersion": "1.0.0&quo…

【HW系列】—溯源與定位—Linux入侵排查

文章目錄 一、Linux入侵排查1.賬戶安全2.特權用戶排查(UID0)3.查看歷史命令4.異常端口與進程端口排查進程排查 二、溯源分析1. 威脅情報(Threat Intelligence)2. IP定位(IP Geolocation)3. 端口掃描&#x…

C++17新特性 Lambda表達式

//lambda表達式的基本語法如下&#xff1a; /* [捕獲列表] (參數列表)mutable(可選)異常屬性 -> 返回類型 { // 函數體 }*/ 1&#xff0c;值捕獲 //1&#xff0c; 值捕獲示例 #include <iostream> void lambda_value_capture() {int value 1;auto copy_value/*返…

園區智能化集成平臺匯報方案

該方案為園區智能化集成平臺設計,依據《智能建筑設計標準》等 20 余項國家與行業規范,針對傳統園區信息孤島、反應滯后、經驗流失、管理粗放等痛點,構建可視化智慧園區管理平臺,實現大屏數據可視化、三維設備監控、智慧運維(含工單管理、巡檢打卡)、能源能耗分析、AI 安防…

Vue-自定義指令

自定義指令 簡單寫法 v-twoAge 功能&#xff1a; 當前年齡翻倍 注意&#xff1a;指令方法名稱 小寫 代碼 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>自定義指令</title><!-- 引入V…

Kotlin 中的數據類型有隱式轉換嗎?為什么?

在 Kotlin 中&#xff0c;基本數據類型沒有隱式轉換。主要出于安全性和明確性的考慮。 1 Kotlin 的顯式類型轉換規則 Kotlin 要求開發者顯式調用轉換函數進行類型轉換&#xff0c; 例如&#xff1a; val a: Int 10 val b: Long a.toLong() // 必須顯式調用 toLong() // 錯…

Android獲取設備信息

使用java: List<TableMessage> dataListnew ArrayList<TableMessage>();//獲取設備信息Hashtable<String,String> ht MyDeviceInfo.getDeviceAllInfo2(LoginActivity.this);for (Map.Entry<String, String> entry : ht.entrySet()) {String key entry…

WIN11使用vscode搭建c語言開發環境

安裝 VS Code 下載地址: Visual Studio Code - Code Editing. Redefined 安裝時勾選 "添加到 PATH"&#xff08;方便在終端中調用 code 命令 下載 MSYS2 官網&#xff1a;MSYS2 下載 msys2-x86_64-xxxx.exe&#xff08;64位版本&#xff09;并安裝。 默認安裝路徑…

微信小程序帶數組參數跳轉頁面,微信小程序跳轉頁面帶數組參數

在微信小程序中&#xff0c;帶數組參數跳轉頁面需要通過JSON序列化和URL編碼處理&#xff0c;以下是具體實現方法 傳遞數組參數?&#xff08;發送頁面&#xff09; wx.navigateTo({url: /pages/targetPage?arr encodeURIComponent(JSON.stringify(yourArray)) });接收數組參…

Mac M1編譯OpenCV獲取libopencv_java490.dylib文件

Window OpenCV下載地址 https://opencv.org/releases/OpenCV源碼下載 https://github.com/opencv/opencv/tree/4.9.0 https://github.com/opencv/opencv_contrib/tree/4.9.0OpenCV依賴 brew install libjpeg libpng libtiff cmake3 ant freetype構建open CV cmake -G Ninja…

前端面試準備-3

1.let、const、var的區別 ①&#xff1a;let和const為塊級作用域&#xff0c;var為全局作用域 ②&#xff1a;let和var可以重新賦值定義&#xff0c;而const不可以 ③&#xff1a;var會提升到作用域頂部&#xff0c;但不會初始化&#xff1b;let和const也會提升到作用不頂部…

Java 中 Lock 接口詳解:靈活強大的線程同步機制

在 Java 中&#xff0c;Lock 是一個接口&#xff0c;它提供了比 synchronized 關鍵字更靈活、更強大的線程同步機制。以下將詳細介紹 Lock 接口及其實現類&#xff0c;以及它與 synchronized 相比的優點。 Lock 接口及其實現類介紹 Lock 接口 Lock 接口定義了一系列用于獲取…

實驗分享|基于sCMOS相機科學成像技術的耐高溫航空涂層材料損傷檢測實驗

1實驗背景 航空發動機外殼的耐高溫涂層材料在長期高溫、高壓工況下易產生微小損傷與裂紋&#xff0c;可能導致嚴重安全隱患。傳統光學檢測手段受限于分辨率與靈敏度&#xff0c;難以捕捉微米級缺陷&#xff0c;且檢測效率低下。 某高校航空材料實驗室&#xff0c;采用科學相機…

python訓練營day40

知識點回顧&#xff1a; 彩色和灰度圖片測試和訓練的規范寫法&#xff1a;封裝在函數中展平操作&#xff1a;除第一個維度batchsize外全部展平dropout操作&#xff1a;訓練階段隨機丟棄神經元&#xff0c;測試階段eval模式關閉dropout 作業&#xff1a;仔細學習下測試和訓練代碼…

Baklib企業CMS全流程管控與智能協作

企業CMS全流程管控方案解析 現代企業內容管理中&#xff0c;全流程管控的實現依賴于對生產、審核、發布及迭代環節的系統化整合。通過動態發布引擎與元數據智能標記技術&#xff0c;系統可自動匹配內容與目標場景&#xff0c;實現標準化模板驅動的快速部署。針對多分支機構的復…

Qt程序添加調試輸出窗口:CONFIG += console

目錄 1.背景 2.解決方案 3.原理詳解 4.控制臺窗口的行為 5.條件編譯&#xff08;僅調試模式顯示控制臺&#xff09; 6.替代方案 7.總結 1.背景 在Qt程序開發中&#xff0c;開發者經常遇到這樣的困擾&#xff1a; 開發機上程序運行正常 發布到其他機器后程序無法啟動 …