Elasticsearch 數據建模與映射(Mapping)詳解

在 Elasticsearch 中,數據建模與映射(Mapping) 是決定搜索性能、存儲效率和功能支持的核心環節。合理的映射設計能讓搜索更精準、聚合更高效、存儲更節省。

本文將全面詳解 Elasticsearch 的 數據建模原則、字段類型、動態映射、自定義分析器、嵌套結構、最佳實踐 等關鍵內容。


一、什么是映射(Mapping)?

映射(Mapping) 是 Elasticsearch 中對索引結構的定義,類似于關系型數據庫中的 Schema。它描述了:

  • 每個字段的名稱和數據類型;
  • 是否分詞(用于全文搜索);
  • 是否索引(可被搜索);
  • 如何處理日期、數字、對象等復雜類型。

? 每個索引都有一個 mapping,定義其文檔結構。


二、映射的核心組成

一個完整的 mapping 包含:

{"mappings": {"properties": { ... },        // 字段定義"dynamic": true,              // 動態映射策略"date_detection": true,       // 是否自動檢測日期"numeric_detection": false,   // 是否自動檢測數字"_source": { "enabled": true }, // 是否存儲原始 JSON"routing": { "required": false }}
}

三、字段類型詳解(Field Types)

Elasticsearch 支持豐富的字段類型,選擇合適的類型至關重要。

1. 常用字段類型

類型用途是否分詞示例
text全文搜索(會分詞)?"這是一段中文文本"
keyword精確匹配、聚合、排序?"status:active"
date日期類型-"2024-06-01T10:00:00Z"
long, integer, short, byte整數-100, -5
double, float浮點數-3.14
boolean布爾值-true, false
ipIP 地址-"192.168.1.1"
geo_point地理位置坐標-{"lat": 39.9, "lon": 116.4}
object嵌套 JSON 對象-{"name": "張三", "age": 30}
nested獨立索引的嵌套對象-數組中的對象列表
binary二進制數據(Base64)-圖片縮略圖
flattened將復雜 JSON 作為 keyword 處理?動態標簽

2. text vs keyword:最重要的選擇

場景推薦類型
搜索商品標題text
聚合品牌、分類keyword
排序價格、時間keyword 或數值類型
精確匹配訂單號keyword

? 最佳實踐:對同一字段使用 多字段(multi-fields)

"title": {"type": "text","analyzer": "ik_max_word","fields": {"keyword": { "type": "keyword" }}
}
  • 搜索用 title
  • 聚合/排序用 title.keyword

四、動態映射(Dynamic Mapping)

1. 什么是動態映射?

當插入一個新字段時,Elasticsearch 自動推斷其類型并添加到 mapping 中。

PUT /my-index/_doc/1
{"user": "張三",      → 推斷為 text + keyword"age": 30,          → 推斷為 long"created": "2024-06-01" → 推斷為 date
}

2. 動態策略(dynamic

設置說明
true(默認)自動添加新字段
false忽略新字段,不報錯
strict拒絕未知字段,拋出異常

? 生產環境建議設為 strict,防止字段污染。

PUT /my-index
{"mappings": {"dynamic": "strict","properties": { ... }}
}

五、自定義分析器(Analyzer)

用于控制 text 字段的分詞方式,直接影響搜索結果。

1. 分析器組成

  • Character Filters:預處理(如 HTML 標簽過濾)
  • Tokenizer:分詞器(如空格、中文分詞)
  • Token Filters:后處理(小寫、停用詞)

2. 示例:中文分詞配置

PUT /news
{"settings": {"analysis": {"analyzer": {"my_ik_analyzer": {"type": "custom","tokenizer": "ik_max_word","filter": ["lowercase"]}}}},"mappings": {"properties": {"content": {"type": "text","analyzer": "my_ik_analyzer"}}}
}

3. 常見中文分詞插件

  • ik:最常用,支持自定義詞典
  • jieba:Python 社區流行
  • smartcn:官方提供,功能有限

六、復雜結構建模

1. object 類型(扁平化對象)

{"address": {"city": "北京","district": "朝陽區"}
}

映射:

"address": {"properties": {"city": { "type": "keyword" },"district": { "type": "keyword" }}
}

?? 內部字段是扁平化的:address.cityaddress.district 是獨立字段。


2. nested 類型(獨立索引的對象)

適用于數組中的對象,需保持內部關系。

示例:用戶評論
{"comments": [{ "user": "A", "content": "好", "likes": 10 },{ "user": "B", "content": "差", "likes": 1 }]
}

錯誤方式(object):

"comments": {"properties": { ... }
}

→ 會匹配 "user:A AND content:差"(跨文檔匹配)

正確方式(nested):

"comments": {"type": "nested","properties": {"user": { "type": "keyword" },"content": { "type": "text" },"likes": { "type": "integer" }}
}

查詢:

"query": {"nested": {"path": "comments","query": {"bool": {"must": [{ "match": { "comments.user": "A" } },{ "match": { "comments.content": "好" } }]}}}
}

3. join 類型(父子文檔)

用于一對多關系(如文章與評論),但性能較低。

"relation": {"type": "join","relations": {"post": "comment"}
}

?? 7.x 后推薦用 nested 或應用層關聯。


七、高級映射設置

1. _source 控制

  • 是否存儲原始 JSON,默認 true
  • 設為 false 可節省空間,但無法:
    • 獲取原始文檔
    • 使用 update API
    • 高亮、腳本字段
"_source": { "enabled": false }

2. doc_valuesfielddata

  • doc_values: true(默認):列式存儲,用于排序、聚合(推薦開啟)
  • fielddata:用于 text 字段聚合,消耗大,不推薦
"tags": {"type": "text","fielddata": true  // 僅在必須時啟用
}

3. index 設置

控制字段是否可被搜索:

"internal_id": {"type": "keyword","index": false  // 不參與搜索,僅存儲
}

八、數據建模最佳實踐 ?

場景建議
文本搜索使用 text + 中文分詞器(如 ik)
聚合/排序使用 keyword 或數值類型
多字段使用 fields 定義 text + keyword
動態字段生產環境設為 strict
嵌套對象使用 nested 保持關系
日期使用 date 類型,格式統一
大字段index: false 節省空間
冗余設計適當反規范化提升查詢性能

九、反規范化 vs 正規范化

策略說明適用場景
反規范化(Denormalization)將關聯數據冗余存儲查詢頻繁、寫少
正規范化(Normalization)拆分為多個索引,通過 join 查詢數據一致性要求高

? Elasticsearch 推薦 適度反規范化,以提升查詢性能。


十、總結:映射設計 checklist

項目是否完成
使用 text 用于全文搜索?
使用 keyword 用于聚合排序?
中文字段配置 IK 分詞器?
關鍵字段啟用 doc_values?
嵌套對象使用 nested?
生產環境 dynamic: strict?
_source 根據需求啟用?
避免 fielddata on text?

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

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

相關文章

5G工業一體機汽車零部件工廠的無紙化管理

在全球數字化轉型的浪潮中,制造業對信息化、智能化的需求日益強烈。尤其是在汽車零部件領域,生產線的復雜性、質量追溯的苛刻性以及對效率的高要求,迫切需要一種高效、可靠、可擴展的管理模式。以“5G工業一體機”為核心的無紙化管理&#xf…

項目管理工具

1、概述IT 項目生命周期通常可分為啟動、規劃、執行、監控與控制、收尾五個核心階段,每個階段的目標和任務不同,所依賴的工具也各有側重。以下按階段梳理常用工具,涵蓋項目管理、協作、技術開發等多個維度。2、啟動階段:明確項目目…

Linux 進程、線程與 exec/系統調用詳解

1. wait 與 waitpid —— 子進程資源回收1.1 waitpid_t wait(int *wstatus);功能:阻塞等待,回收任意子進程的資源空間。參數:wstatus:保存子進程退出狀態的變量地址NULL:不保存退出狀態返回值:成功&#xf…

Laravel 使用ssh鏈接遠程數據庫

1.創建ssh ssh -i ./id_rsa -N -L 13306:127.0.0.1:3306 -p 22 root***對上述代碼的解釋: 命令是一個SSH隧道命令,用于將本地端口3306轉發到遠程服務器上的3306端口。以下是命令的詳細解釋:# 調用SSH客戶端。 ssh # 指定用于身份驗證的私鑰文…

Python延申內容(一)

1.技術面試題 (1)TCP與UDP的區別是什么? 答: TCP(傳輸控制協議):面向連接、可靠傳輸(數據完整有序)、流量控制、擁塞控制,適用于文件傳輸、網頁瀏覽等場景。 …

Java 9 新特性及具體應用

目錄 1. 模塊系統(Jigsaw) 2. JShell(REPL工具) 3. 集合工廠方法 4. 接口私有方法 5. Stream API 增強 6. HTTP/2 客戶端(Incubator) 7. 多版本JAR包 總結 1. 模塊系統(Jigsaw&#xff0…

第二十五天:構造函數/析構函數/拷貝構造

構造函數/析構函數/拷貝構造 1. 構造函數(Constructor) 定義與作用:構造函數是一種特殊的成員函數,其名稱與類名相同,沒有返回類型(包括 void 也沒有)。它的主要作用是在創建對象時初始化對象的…

【P14 3-6 】OpenCV Python——視頻加載、攝像頭調用、視頻基本信息獲取(寬、高、幀率、總幀數),視頻保存在指定位置

文章目錄1 讀取本地視頻1.1 絕對路徑 6種方式1.2 相對路徑 4種方式1.3 讀取本地視頻2 視頻基本信息3 調用攝像頭 并將視頻保存在指定位置P14 3-6 1 讀取本地視頻 現在要讀取本地視頻“video.mp4”, 視頻文件“video.mp4”和playVideo.py腳本文件,都在…

【DL學習筆記】常用數據集總結

一、如何找數據集 paperswithcode,但好像沒了 AutoDL Roboflow Kaggle Hungging Face 百度飛漿PP AIStudio 二、目標檢測數據集格式 常用數據集坐標格式 MSCOCO : 坐標格式(x,y,w,h&#xff…

19.3 Transformers量化模型極速加載指南:4倍推理加速+75%顯存節省實戰

Transformers量化模型極速加載指南:4倍推理加速+75%顯存節省實戰 實戰項目:模型量化 Transformers 兼容性配置 量化模型加載核心配置邏輯 #mermaid-svg-rDjfMigtxckLYWp3 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#merm…

Android 終端接入 GB28181 國標視頻平臺的完整解決方案解析

1. 引言:讓 Android 終端無縫融入國標視頻網絡在公安、交通、應急、工業、教育等領域,GB/T 28181 國標協議早已成為視頻監控與指揮調度的事實標準。傳統國標視頻網絡通常由固定部署的 IPC 攝像機、NVR、視頻管理平臺構成,設備形態單一。隨著一…

Docker目錄的遷移

# 遷移 docker 目錄 (無論容器與鏡像占用空間大小,哪怕只占用1G,也需用此方式,否則可能遷移不成功)service docker stopcd /var/lib/docker# 一個一個復制除 overlay2 外的其他所有文件夾cp -R builder /home/docker/l…

IOS APP 前端存儲

UserDefaults優點簡單易用提供簡單的鍵值對存儲接口無需復雜配置,開箱即用適合存儲少量簡單數據輕量級專門為存儲小量數據設計內存占用小性能開銷低自動持久化數據自動保存到磁盤應用重啟后數據仍然可用通過synchronize()方法可以強制立即寫入(iOS 12已自…

在前端js中使用jsPDF或react-to-pdf生成pdf文件時,不使用默認下載,而是存儲到服務器

開源地址: https://github.com/ivmarcos/react-to-pdf 主要就是這個方法,有三種可選: 默認是save,也就是會自動觸發下載的方法,open方法是默認會打開一個pdf預覽的tab頁面,build方法就是在調用的函數gener…

會議征稿!IOP出版|第二屆人工智能、光電子學與光學技術國際研討會(AIOT2025)

往屆已EI檢索,歡迎投稿! AIOT2024會后兩個月實現見刊! AIOT2025已通過IOP-JPCS出版申請,獨立JPCS出版 AIOT2025已上線西安文理學院官網: 征文通知|第二屆人工智能、光電子學與光學技術國際…

CPP多線程2:多線程競爭與死鎖問題

在多線程編程中,多個線程協同工作能顯著提升程序效率,但當它們需要共享和操作同一資源時,潛在的問題也隨之而來;線程間的執行順序不確定性可能導致資源競爭,可能引發死鎖,讓程序陷入停滯。 多線程競爭問題示…

全國產飛騰d2000+復旦微690t信號處理模塊

UD VPX-404是基于高速模擬/數字采集回放、FPGA信號實時處理、CPU主控、高速SSD實時存儲架構開發的一款高度集成的信號處理組合模塊,采用6U VPX架構,模塊裝上外殼即為獨立整機,方便用戶二次開發。 UD VPX-404模塊的國產率可達到100%&#xff0…

物聯網 (IoT) 的頂級硬件平臺

物聯網 (IoT) 的頂級硬件平臺IoT(物聯網)不再是一個流行詞。隨著每天出現幾個鼓舞人心的用例,多家公司現在正在探索如何利用該技術實現業務增長。無論實施何種其他技術,基于物聯網的新設備正迅速成為一項重…

TCP傳輸層協議(4)

TCP應用層協議(4) 流量控制 接收端處理數據的速度是有限的. 如果發送端發的太快, 導致接收端的緩沖區被打滿, 這個時候如果發送端繼續發送, 就會造成丟包, 繼而引起丟包重傳等等一系列連鎖反應. 因此 TCP 支持根據接收端的處理能力, 來決定發送端的發送速…

雙向SSL認證之Apache實戰配置

防御未授權訪問,為企業級應用構筑雙重身份驗證防線 本文是關于Apache配置雙向SSL認證的深度技術指南,包含全流程操作、調試技巧及企業級解決方案,適用于運維工程師和安全管理員。 1.為什么需要雙向認證 ? 核心價值 &#x1f51…