ElasticSearch的映射與文檔
概述
映射官方文檔:
映射(she)(mapping)是(shi)ES中一(yi)個很重要的概念,我們知道ES的索引類(lei)似于(yu)MySQL中的表,而(er)映射(she)就類(lei)似于(yu)MySQL中的表結構,而(er)文檔(Document)就是(shi)MySQL表中的一(yi)行行數據。
映(ying)射(Mapping)的作用(yong)是(shi)定義文(wen)檔(dang)的結(jie)構與數據類型,同時也(ye)能設置如何對(dui)文(wen)檔(dang)進行(xing)索引(yin)
映射(she)(she)分(fen)為動(dong)態映射(she)(she)和顯示映射(she)(she)
- 動態映射是只需在ES中添加文檔即可自動添加新字段。您可以將字段添加到頂級映射以及內部object 和nested外部字段。
- 顯示映射是需要你添加文檔前定義好每個字段的數據類型,例如:
- 哪些字符串字段應被視為全文字段
- 哪些字段包含數字、日期或地理位置
- 日期值的 格式
- 自定義規則來控制動態添加字段 的映射
數據類型介紹
官方文檔:
常見類型
-
binary
- 存儲編碼為 Base64 字符串的二進制值類型。
-
boolean
- 只包含true和false兩個值
-
keyword
- 用于結構化內容,例如 ID、電子郵件地址、主機名、狀態代碼、郵政編碼或標簽。使用分詞器時不會被分詞
-
text
- 用于全文內容(例如電子郵件正文或產品描述)的傳統字段類型。適合全文檢索
-
date
- 用于存儲日期,可使用
format指定格式化類型
- 用于存儲日期,可使用
-
數字
- ES中數字類型有很多種,基本的可參考Java中的數據類型
- byte:一個有符號的 8 位整數,最小值為-128,最大值為127
- short:一個有符號的 16 位整數,最小值為-32,768,最大值為32,767
- integer:一個有符號的 32 位整數,最小值為-231,最大值為231 - 1
- long:一個有符號的 64 位整數,最小值為-263,最大值為263 - 1。
- double:雙精度 64 位 IEEE 754 浮點數,限制為有限值。
- float:單精度 32 位 IEEE 754 浮點數,限制為有限值。
- half_float:半精度 16 位 IEEE 754 浮點數,限制為有限值。
- scaled_float:由 支持的浮點數long,按固定double比例因子縮放
- unsigned_long:一個無符號的 64 位整數,最小值為 0,最大值為2^64 - 1
- ES中數字類型有很多種,基本的可參考Java中的數據類型
-
數組
- Elasticsearch 沒有專門的array數據類型。默認情況下,任何字段都可以包含零個或多個值,但是,數組中的所有值必須屬于相同的數據類型。例如:
- 字符串數組:[ "one", "two"]
- 整數數組:[ 1, 2]
- 數組的數組: [ 1, [ 2, 3]] 相當于 [ 1, 2, 3]
- 對象數組:[ { "name": "Mary", "age": 12 }, { "name": "John", "age": 10 }]
- Elasticsearch 沒有專門的array數據類型。默認情況下,任何字段都可以包含零個或多個值,但是,數組中的所有值必須屬于相同的數據類型。例如:
-
對象
- JSON 文檔本質上是分層的:文檔可能包含內部對象,而內部對象本身又可能包含內部對象:
-
IP
- 用于存儲IPv4或IPv6地址。
常用的(de)數據類型就是以(yi)上幾種,如果需(xu)要其它的(de)場景,可以(yi)參考官方文檔
映射的管理
創建映射
靜態映射(顯示創建)
創建(jian)索引時定義映射,控(kong)制(zhi)字段類型和配置(zhi):
PUT /my_index
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"refresh_interval": "1s"
}
// 定義映射
"mappings": {
"properties": {
"title": { "type": "text" },
"price": { "type": "double" },
"tags": { "type": "keyword" },
"created_at": { "type": "date", "format": "yyyy-MM-dd" }
}
}
}
動態映射(自動創建)
當插入(ru)文檔(dang)時,如果字段不存在,ES 會根(gen)據數據類型自(zi)動創建映射。例如:
PUT /my_index/_doc/1
{
"title": "Elasticsearch Guide",
"price": 49.99,
"tags": ["search", "database"]
}
ES 會自動為(wei)字(zi)段 title(text+keyword)、price(double)和(he) tags(keyword)創建映射(she)。
查看映射
- 查看單個索引的映射
GET /my_index/_mapping
- 查看多個索引的映射
GET /index1,index2/_mapping
- 查看所有索引的映射
GET /_mapping
更新映射
新增字段(支持動態更新)
可以向現有映射添加新(xin)字段:
PUT /my_index/_mapping
{
"properties": {
"description": { "type": "text" },
"in_stock": { "type": "boolean" }
}
}
修改字段類型(不支持直接修改)
若需修改現有字段類型(xing),需創建新索引并重新索引數據:
// 1. 創建新索引并定義正確的映射
PUT /new_my_index
{
"mappings": {
"properties": {
"price": { "type": "integer" } // 原類型為double,現改為integer
}
}
}
// 2. 使用_reindex API遷移數據
POST /_reindex
{
"source": { "index": "my_index" },
"dest": { "index": "new_my_index" }
}
// 3. 驗證數據后刪除舊索引
DELETE /my_index
刪除映射
- 刪除索引(同時刪除映射)
DELETE /my_index
- 重置映射(刪除后重建)
刪除索引后重新創建并定義新映射:
DELETE /my_index
PUT /my_index
{
"mappings": { ... } // 新映射定義
}
映射參數詳解
核心參數
- type:字段類型(text、keyword、integer 等)
- index:是否索引(true/false)
- analyzer:指定分詞器(如 standard、english)
- search_analyzer:搜索時使用的分詞器(與 analyzer 不同時生效)
- null_value:替代 null 值的默認值(需與字段類型匹配)
- dynamic:控制動態添加字段的行為(true/false/strict)
高級參數
- copy_to:將字段值復制到目標字段,便于組合搜索
- doc_values:是否存儲列式數據(用于聚合和排序,默認 true)
- norms:是否存儲歸一化因子(影響評分,text 默認 false)
- fields:多字段索引(如同時存儲 text 和 keyword 類型)
文檔的管理
在 Elasticsearch(ES)中,文(wen)檔(Document)是可被索引(yin)的基本數據單(dan)元,以(yi) JSON 格式存儲(chu)
下面(mian)只列舉了常用的文檔(dang)管理的api,如(ru)果想要了解其它的可以參(can)考官方文檔(dang):
文檔的基本概念
- 文檔結構:JSON 對象,包含字段和值。
- 唯一性標識:每個文檔在索引中需有唯一 ID(可自動生成或手動指定)。
- 元數據字段:
- _index:文檔所在的索引名。
- _id:文檔的唯一標識符。
- _source:原始 JSON 文檔。
- _version:文檔版本號,用于樂觀鎖。
創建文檔
指定id創建
PUT /my_index/_doc/1
{
"title": "Getting Started with ES",
"content": "First steps in Elasticsearch",
"user": "john_doe",
"views": 100
}
自動生成id
返回(hui)結果包含自動生(sheng)成的(de)_id。
POST /my_index/_doc
{
"title": "Elasticsearch Tutorial",
"content": "Learn Elasticsearch basics",
"tags": ["search", "database"],
"created_at": "2023-01-01"
}
獲取文檔
根據 ID 獲取單(dan)個文檔(dang)
GET /my_index/_doc/1
檢查文檔是否存在
HEAD /my_index/_doc/1
獲取(qu)文檔中指定的字段
GET /my_index/_doc/1?_source=filed1,filed2
更新文檔
全量更新
PUT /my_index/_doc/1
{
"title": "Updated Title", // 原文檔的其他字段會被刪除
"views": 101
}
部分更新
POST /my_index/_update/1
{
"doc": {
"views": 102, // 僅更新views字段
"updated_at": "now" // 添加新字段
}
}
刪除文檔
根據 ID 刪除單個文檔
DELETE /my_index/_doc/1
基于查詢條件刪除(需啟用 delete-by-query 插件)
POST /my_index/_delete_by_query
{
"query": {
"term": {
"user": "john_doe"
}
}
}
動態映射詳解
官方文檔:
動(dong)(dong)態映(ying)射是只需在ES中添加文檔即可自動(dong)(dong)添加新字(zi)(zi)段。您(nin)可以(yi)將字(zi)(zi)段添加到頂級映(ying)射以(yi)及(ji)內部object 和nested外部字(zi)(zi)段。
驗證動態映射
創建(jian)一個索引,無需指定映(ying)射(she)
PUT dynamic-mapping-01
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"refresh_interval": "1s"
}
}
添加一個文檔
# 請求
PUT dynamic-mapping-01/_doc/1
{
"create_date": "2015/09/02",
"name": "huangsir",
"age": 18,
"addr": "BeiJing",
"ip": "10.0.0.40"
}
查詢文檔
# 請求
GET dynamic-mapping-01/_doc/1
# 預期返回
{
"_index" : "dynamic-mapping-01", //索引名稱
"_type" : "_doc", // 類型
"_id" : "1", // 唯一標識
"_version" : 1, //版本號
// 排序
"_seq_no" : 0,
// 分片
"_primary_term" : 1,
"found" : true,
// 添加的數據
"_source" : {
"create_date" : "2015/09/02",
"name" : "huangsir",
"age" : 18,
"addr" : "BeiJing",
"ip" : "10.0.0.40"
}
}
查看映射
# 請求
GET /dynamic-mapping-01/_mapping
# 預期返回
{
"dynamic-mapping-01" : {
"mappings" : {
"properties" : {
"addr" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"age" : {
"type" : "long"
},
"create_date" : {
"type" : "date",
"format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
},
"ip" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
通過上面的(de)(de)驗證,發現其(qi)(qi)對(dui)應的(de)(de)字段的(de)(de)數據(ju)類型并不是我們想要的(de)(de),我們可以指(zhi)定其(qi)(qi)數據(ju)類型
驗證靜態映射
官方文檔:
靜態映射是在創建索(suo)引時指(zhi)定映射的(de)字段、數據類(lei)型及其它(ta)相關的(de)配置
創建索引
# 請求
PUT explicit-mapping-01
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1,
"refresh_interval": "1s"
},
"mappings": {
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "byte"
},
"addr": {
"type": "keyword"
},
"ip": {
"type": "ip"
},
"create_date": {
"type": "date",
"format": "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
},
"class": {
"type": "object",
"properties": {
"name":{
"type": "text"
}
}
}
}
}
}
# 預期返回
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "explicit-mapping-01"
}
查看映射
# 請求
GET explicit-mapping-01/_mapping
# 預期返回
{
"explicit-mapping-01" : {
"mappings" : {
"properties" : {
"addr" : {
"type" : "keyword"
},
"age" : {
"type" : "byte"
},
"class" : {
"properties" : {
"name" : {
"type" : "text"
}
}
},
"create_date" : {
"type" : "date",
"format" : "yyyy/MM/dd HH:mm:ss||yyyy/MM/dd||epoch_millis"
},
"ip" : {
"type" : "geo_point"
},
"name" : {
"type" : "text"
}
}
}
}
}
創建文檔
# 請求
POST explicit-mapping-01/_doc
{
"create_date": "2015/09/02",
"name": "huangsir",
"age": 18,
"addr": "BeiJing",
"ip": "10.0.0.40",
"class": {
"name": "清華大學"
}
}
# 預期返回
{
"_index" : "explicit-mapping-01",
"_type" : "_doc",
"_id" : "C0JSlpcB-K0y8avWYdSX",
"_version" : 1,
"result" : "created",
"_shards" : {
"total" : 2,
"successful" : 2,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
查看文檔
# 請求
GET explicit-mapping-01/_doc/C0JSlpcB-K0y8avWYdSX
# 預期返回
{
"_index" : "explicit-mapping-01",
"_type" : "_doc",
"_id" : "C0JSlpcB-K0y8avWYdSX",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"create_date" : "2015/09/02",
"name" : "huangsir",
"age" : 18,
"addr" : "BeiJing",
"ip" : "10.0.0.40",
"class" : {
"name" : "清華大學"
}
}
}
本文來自博客園,作者:huangSir-devops,轉載請注明原文鏈接://www.xtjzw.net/huangSir-devops/p/18940060,微信(xin)Vac666666,歡迎交流
