ElasticSearch深入解析(九):Object、Nested、Flattened類型

文章目錄

      • 一、Object 類型:默認的嵌套對象處理方式
        • 核心原理
        • 典型場景
        • 關鍵限制
      • 二、Nested 類型:解決嵌套數組的關聯查詢
        • 核心原理
        • 典型場景
        • 使用示例
        • 注意事項
      • 三、Join 類型:跨文檔的父子關聯
        • 核心原理
        • 典型場景
        • 使用示例
        • 注意事項
      • 四、Flattened 類型:動態嵌套對象的輕量化處理
        • 核心原理
        • 典型場景
        • 使用示例
        • 注意事項
      • 五、類型對比與選擇建議

Elasticsearch 作為面向文檔的搜索引擎,對嵌套數據的處理有多種方式,不同類型適用于不同的業務場景。

一、Object 類型:默認的嵌套對象處理方式

核心原理

Elasticsearch 中,JSON 文檔的嵌套對象(如 {"user": {"name": "張三", "age": 25}})會被默認映射為 Object 類型。其底層通過 字段扁平化 實現索引:將嵌套對象的字段展開為 父字段.子字段 的形式(如 user.nameuser.age),存儲為獨立的字段。

典型場景

適用于 簡單嵌套對象,且不需要對嵌套對象內部字段進行 關聯查詢 的場景。例如:

{"article": {"title": "ES 數據類型指南","author": { "name": "李四", "email": "lisi@example.com" }}
}

此時 author 是一個簡單對象,若只需查詢 author.nameauthor.email 的獨立值(不關心是否屬于同一作者),Object 類型足夠。

關鍵限制

當嵌套對象是 數組 時(如一個用戶有多個地址),Object 類型會 丟失對象內部字段的關聯。例如:

{"user": "張三","addresses": [{"city": "北京", "zip": "100000"},{"city": "上海", "zip": "200000"}]
}

Elasticsearch 會將 addresses.city 存儲為 ["北京", "上海"]addresses.zip 存儲為 ["100000", "200000"]。若執行查詢 city=北京 AND zip=200000,會錯誤匹配到這條文檔(因為字段被扁平化,不關心“北京”和“200000”是否屬于同一個地址對象)。

二、Nested 類型:解決嵌套數組的關聯查詢

核心原理

Nested 類型是 Object 類型的擴展,專門用于處理 嵌套對象數組。它將數組中的每個對象 獨立索引為一個“子文檔”,保留對象內部字段的關聯關系。查詢時需使用 nested 查詢,確保只匹配同一嵌套對象內的字段。

典型場景

適用于 一對多關聯 且需要對嵌套對象內部字段進行 組合查詢 的場景。例如:

  • 訂單的多個商品(需查詢“購買了蘋果手機且數量>2的訂單”);
  • 用戶的多個地址(需查詢“城市為北京且郵編為100000的地址”)。
使用示例

映射定義

PUT /my_index
{"mappings": {"properties": {"user": {"type": "nested",  // 指定為 nested 類型"properties": {"name": {"type": "keyword"},"address": {"type": "nested",  // 支持多層嵌套"properties": {"city": {"type": "keyword"},"zip": {"type": "keyword"}}}}}}}
}

查詢示例(匹配同一地址內的城市和郵編):

GET /my_index/_search
{"query": {"nested": {"path": "user.address",  // 指定嵌套路徑"query": {"bool": {"must": [{"term": {"user.address.city": "北京"}},{"term": {"user.address.zip": "100000"}}]}}}}
}
注意事項
  • 性能與存儲:每個嵌套對象獨立索引,會增加索引體積(約為普通 Object 類型的 1.5~3 倍);
  • 嵌套層級:支持多層嵌套(如 user.address.street),但深度建議不超過 5 層(過深會影響查詢性能);
  • 更新限制:修改嵌套對象的任意字段需重新索引整個父文檔(類似關系型數據庫的級聯更新)。

三、Join 類型:跨文檔的父子關聯

核心原理

Join 類型允許在 同一索引 中建立父子文檔關系(如父文檔是“用戶”,子文檔是“用戶的訂單”)。通過 _parent 字段關聯父子文檔,父文檔和子文檔需存儲在 同一分片 上(通過父文檔的 _id 哈希到分片)。

典型場景

適用于 跨文檔的一對多關聯,且父子文檔需要 獨立更新 的場景。例如:

  • 論壇的“板塊(父)- 帖子(子)”;
  • 企業的“部門(父)- 員工(子)”。
使用示例

映射定義

PUT /my_index
{"mappings": {"properties": {"join_field": { "type": "join","relations": {"department": "employee"  // 父類型: "department",子類型: "employee"}}}}
}

創建父文檔(部門)

PUT /my_index/_doc/1
{"name": "技術部","join_field": { "name": "department" }  // 標記為父類型
}

創建子文檔(員工)

PUT /my_index/_doc/2?routing=1  // 必須與父文檔同分片(routing=父文檔ID)
{"name": "張三","join_field": { "name": "employee", "parent": "1"  // 關聯父文檔ID}
}

查詢示例(查詢技術部的所有員工):

GET /my_index/_search
{"query": {"has_parent": {"parent_type": "department","query": { "term": { "name": "技術部" } }}}
}
注意事項
  • 性能瓶頸:父子查詢需要跨文檔關聯(類似關系型數據庫的 JOIN),性能低于 Nested 類型(Nested 是單文檔內的關聯);
  • 分片限制:父文檔和子文檔必須同分片,若父文檔分布不均可能導致分片數據傾斜;
  • 適用場景:僅當父子文檔需要 獨立更新(如父文檔修改不影響子文檔)時使用,否則優先選擇 Nested 類型。

四、Flattened 類型:動態嵌套對象的輕量化處理

核心原理

Flattened 類型用于將 復雜的嵌套 JSON 對象(如動態結構的元數據)展平為單個字段。所有嵌套的鍵會被合并為 點分隔的字符串(如 {"a": {"b": "c"}} 會被展平為 a.b: c),并索引為 keyword 類型(支持精確匹配)。

典型場景

適用于 動態或未知結構的嵌套對象,例如:

  • 日志中的 tags 字段(可能包含任意層級的鍵值對);
  • 商品的擴展屬性(如不同品類的額外信息)。
使用示例

映射定義

PUT /my_index
{"mappings": {"properties": {"metadata": {"type": "flattened"  // 指定為 flattened 類型}}}
}

文檔示例

PUT /my_index/_doc/1
{"metadata": {"user": {"name": "張三","age": 25},"device": "iPhone 15"}
}

此時 metadata 會被展平為 metadata.user.name: "張三"metadata.user.age: "25"metadata.device: "iPhone 15" 等字段。

查詢示例(精確匹配展平后的路徑):

GET /my_index/_search
{"query": {"term": { "metadata.user.name": "張三" }  // 直接使用展平后的字段名}
}
注意事項
  • 字段限制:展平后的字段數量默認最多 1000 個(可通過 max_flattened_fields 參數調整);
  • 查詢能力:僅支持精確匹配(term)或前綴匹配(prefix),無法進行范圍查詢(如 age>20);
  • 適用場景:優先用于 不需要復雜查詢 的動態嵌套對象(如日志元數據),避免因動態映射導致字段爆炸。

五、類型對比與選擇建議

類型核心特點適用場景性能與限制
Object扁平化存儲,丟失嵌套對象關聯簡單嵌套對象,無需關聯查詢輕量,無法處理嵌套數組的關聯查詢
Nested獨立索引嵌套對象,保留關聯一對多嵌套數組,需關聯查詢索引體積大,更新成本高
Join跨文檔父子關聯父子需獨立更新,跨文檔查詢查詢性能差,分片限制嚴格
Flattened展平動態嵌套對象,簡化索引動態/未知結構的嵌套對象,輕查詢僅支持精確匹配,字段數量受限

選擇建議

  1. 優先使用 Nested 類型 處理嵌套數組的關聯查詢(如訂單-商品);
  2. 僅當父子需獨立更新時使用 Join 類型(如部門-員工);
  3. 動態或未知結構的嵌套對象用 Flattened 類型(如日志元數據);
  4. 簡單嵌套對象且無需關聯查詢時,使用默認的 Object 類型

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

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

相關文章

36、C#中的?法聲明參數關鍵字params,ref,out的意義及?法

在C#中,params、ref 和 out 是方法聲明中用于修飾參數的關鍵字,它們各自有不同的用途和語義。以下是它們的詳細說明和用法: 1、 params 關鍵字 意義 params 允許方法接受可變數量的參數,這些參數會被編譯為一個數組。適用于參數…

【大模型實戰篇】華為信創環境采用vllm部署QwQ-32B模型

1. 背景 本文分享在華為昇騰機器上部署QwQ-32B模型的實踐。 首先華為自己是提供了一套在信創機器(NPU)上部署模型的方案【1】,但是部署之后,測試發現會有輸出截斷的現象。QwQ-32B本身是支持128k的最大上下文長度,定位…

前端面經-VUE3篇(二)--vue3基礎知識(二)計算屬性(computed)、監聽屬性(Watch)

一、計算屬性(computed) 計算屬性(Computed Properties)是 Vue 中一種特殊的響應式數據,它能基于已有的響應式數據動態計算出新的數據。 計算屬性有以下特性: 自動緩存:只有當它依賴的響應式數據發生變化時&#xff…

[預備知識] 5. 優化理論(一)

優化理論 梯度下降(Gradient Descent) 數學原理與可視化 梯度下降是優化領域的基石算法,其核心思想是沿負梯度方向迭代更新參數。數學表達式為: θ t 1 θ t ? α ? θ J ( θ t ) \theta_{t1} \theta_t - \alpha \nabla…

大模型微調Fine-tuning:從概念到實踐的全面解析

目錄 引言 一、什么是大模型微調? 1.1 預訓練與微調的區別 1.2 微調的技術演進 二、為什么需要微調? 2.1 解決大模型的固有局限 2.2 微調的優勢 三、主流微調方法 3.1 全參數微調 3.2 參數高效微調(PEFT) 四、微調實踐指…

Docker 使用下 (二)

Docker 使用下 (二) 文章目錄 Docker 使用下 (二)前言一、初識Docker1.1 、Docker概述1.2 、Docker的歷史1.3 、Docker解決了什么問題1.4 、Docker 的優點1.5 、Docker的架構圖 二、鏡像三、容器四、數據卷4.1、數據卷的概念4.2 、…

洛谷P12238 [藍橋杯 2023 國 Java A] 單詞分類

[Problem Discription] \color{blue}{\texttt{[Problem Discription]}} [Problem Discription] Copy from luogu. [Analysis] \color{blue}{\texttt{[Analysis]}} [Analysis] 既然都是字符串前綴的問題了,那當然首先就應該想到 Trie \text{Trie} Trie 樹。 我們可…

pta作業中有啟發性的程序題

1 【知識點】&#xff1a;多態 函數接口定義&#xff1a; 以Student為基類&#xff0c;構建GroupA, GroupB和GroupC三個類 裁判測試程序樣例&#xff1a; #include<iostream> #include <string> using namespace std;/* 請在這里填寫答案 */int main() {const …

Scrapy框架之CrawlSpider爬蟲 實戰 詳解

CrawlSpider 是 Scrapy 框架中一個非常實用的爬蟲基類&#xff0c;它繼承自 Spider 類&#xff0c;主要用于實現基于規則的網頁爬取。相較于普通的 Spider 類&#xff0c;CrawlSpider 可以根據預定義的規則自動跟進頁面中的鏈接&#xff0c;從而實現更高效、更靈活的爬取。 Scr…

Glide 如何加載遠程 Base64 圖片

最近有個需求&#xff0c;后端給出的圖片地址并不是正常的 URL&#xff0c;而且需要一個接口去請求&#xff0c;但是返回的是 base64 數據流。這里不關心為啥要這么多&#xff0c;原因有很多&#xff0c;可能是系統的問題&#xff0c;也可能是能力問題。當然作為我們 Android 程…

004-nlohmann/json 快速認識-C++開源庫108杰

了解 nlohmann/json 的特點&#xff1b;理解編程中 “數據戰場”劃分的概念&#xff1b;迅速上手多種方式構建一個JSON對象&#xff1b; 1 特點與安裝 nlohmann/json 是一個在 github 長期霸占 “JSON” 熱搜版第1的CJSON處理庫。它的最大優點是與 C 標準庫的容器數據&#xf…

#基礎Machine Learning 算法(上)

機器學習算法的分類 機器學習算法大致可以分為三類&#xff1a; 監督學習算法 (Supervised Algorithms&#xff09;:在監督學習訓練過程中&#xff0c;可以由訓練數據集學到或建立一個模式&#xff08;函數 / learning model&#xff09;&#xff0c;并依此模式推測新的實例。…

正弦波、方波、三角波和鋸齒波信號發生器——Multisim電路仿真

目錄 Multisim使用教程說明鏈接 一、正弦波信號發生電路 1.1正弦波發生電路 電路組成 工作原理 振蕩頻率 1.2 正弦波發生電路仿真分析 工程文件鏈接 二、方波信號發生電路 2.1 方波發生電路可調頻率 工作原理 詳細過程 2.2 方波發生電路可調頻率/可調占空比 調節占空比 方波產生…

【AND-OR-~OR鎖存器設計】2022-8-31

緣由鎖存器11111111111-硬件開發-CSDN問答 重置1&#xff0c;不論輸入什么&#xff0c;輸出都為0&#xff1b; 重置0&#xff0c;輸入1就鎖住1 此時輸入再次變為0&#xff0c;輸出不變&#xff0c;為鎖住。

力扣-字符串-468 檢查ip

思路 考察字符串的使用&#xff0c;還有對所有邊界條件的檢查 spilt&#xff08;“\.”&#xff09;&#xff0c;toCharArray&#xff0c;Integer.parseInt() 代碼 class Solution {boolean checkIpv4Segment(String str){if(str.length() 0 || str.length() > 4) retur…

BC8 十六進制轉十進制

題目&#xff1a;BC8 十六進制轉十進制 描述 BoBo寫了一個十六進制整數ABCDEF&#xff0c;他問KiKi對應的十進制整數是多少。 輸入描述&#xff1a; 無 輸出描述&#xff1a; 十六進制整數ABCDEF對應的十進制整數&#xff0c;所占域寬為15。 備注&#xff1a; printf可以使用…

ARM子程序和棧

微處理器中的棧由棧指針指向存儲器中的棧頂來實現&#xff0c;當數據項入棧時&#xff0c;棧 指針向上移動&#xff0c;當數據項出棧時&#xff0c;棧指針向下移動。 實現棧時需要做出兩個決定&#xff1a;一是當數據項進棧時是向低位地址方向向上生 長&#xff08;圖a和圖b&a…

jwt身份驗證和基本的利用方式

前言 &#xff1a; 什么是jwt&#xff08;json web token&#xff09;&#xff1f; 看看英文單詞的意思就是 json形式的token 他的基本的特征 &#xff1a; 類似于這樣的 他有2個點 分割 解碼的時候會有三個部分 頭部 payload 對稱密鑰 這個就是對稱加密 頭部&am…

n8n工作流自動化平臺的實操:利用本地嵌入模型,完成文件內容的向量化及入庫

1.成果展示 1.1n8n的工作流 牽涉節點&#xff1a;FTP、Code、Milvus Vector Store、Embeddings OpenAI、Default Data Loader、Recursive Character Text Splitter 12.向量庫的結果 2.實操過程 2.1發布本地嵌入模型服務 將bge-m3嵌入模型&#xff0c;發布成滿足open api接口…

MATLAB人工大猩猩部隊GTO優化CNN-LSTM多變量時間序列預測

本博客來源于CSDN機器魚&#xff0c;未同意任何人轉載。 更多內容&#xff0c;歡迎點擊本專欄目錄&#xff0c;查看更多內容。 目錄 0 引言 1 數據準備 2 CNN-LSTM模型搭建 3 GTO超參數優化 3.1 GTO函數極值尋優 3.2 GTO優化CNN-LSTM超參數 3.3 主程序 4 結語 0 引言…