Elasticsearch Mapping 原理及範例說明
Mapping 類似於資料庫中的 schema,主要的作用如下:
- 定義類型 (bool, string, num…)
- 設定屬性倒排索引
在 Elasticsearch 數據產生時,其實都自動進行 mapping,但有時如果有特別的業務需求,則可以自行設定 mapping ,
特別提醒!如果特別需求,請在一開始就建立好 Mapping,因為Mapping建立後,就不能修改。
(另外,後續會在提到如何透過 Index Aliases 來作為 Interface ,更好的讓 index 有 v1, v2… 多版本時,可以統一由 Aliases 作為介面,只要在建立新版本 index 及資料移轉完成後,將Aliases 指向新的 index 即可。)
起手式,一個 Mapping 基本定義的方式如下:
PUT poc-trylog
{
"mappings": {
//define your mappings
}
}
通常,自行定義 Mapping 會建議將一個樣本寫入到一個臨時的索引,ES 就會自動產生 mapping ,
例如,我們建立一個新的 index 以及放入內容
POST try-mappings/_doc/1
{
"name":"brown",
"phone":"0999333333",
"age":18,
"birth":"2020-01-01",
"members":"true"
}
取得 Mapping 結構
取得 try-mapping 的 mapping 方式如下:
GET try-mappings/_mapping
得到的 Mapping 結果為
{
"try-mappings" : {
"mappings" : {
"properties" : {
"age" : {
"type" : "long"
},
"birth" : {
"type" : "date"
},
"members" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"phone" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}
基本上大部分結構都沒問題,但是 members 其實是布林值,因此在這裡必須要修改一下 mapping
但是如果這時直接修改,會發生錯誤訊息:
刪除索引
因此,要留意的是,必須在一開始就設定好 mapping
我們先手動刪除掉索引,再重新建立 Mapping
刪除索引:
DELETE try-mappings
輸出結果:
{
"acknowledged" : true
}
手動建立 Mapping
在一開始先手動建立 Mapping
PUT try-mappings
{
"mappings": {
"properties" : {
"age" : {
"type" : "long"
},
"birth" : {
"type" : "date"
},
"members" : {
"type" : "boolean"
},
"name" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"phone" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
接著我們再新增一筆數據
POST try-mappings/_doc/1
{
"name":"brown",
"phone":"0999333333",
"age":18,
"birth":"2020-01-01",
"members":"true"
}
查看 mapping 結果
GET try-mappings/_mapping
輸出結果,就可以看到 members 的 type 已經變成. boolean
關於 Mapping keyword
Mapping 其中一個類型是 keyword ,keyword 是不會被收錄到分詞處理(可參考: Elasticsearch Analyzer 分詞器是什麼?實際範例演練)
所以,在 keyword 只要放入內容,Elasticsearch 就會直接將內容完整儲存。
例如:
PUT try-mappings
{
"mappings": {
"properties" : {
"name" : {
"type" : "keyword"
}
}
}
}
Mapping index
Mapping 的 index 屬性為 boolean,可以指定該屬性是否能夠被倒排索引
例如,以下的 name 欄位設定 index 為false,該欄位就不能被搜尋:
PUT try-mappings
{
"mappings": {
"properties" : {
"name" : {
"type" : "text",
"index": false
}
}
}
}
Mapping 的 Null value,允許空值
在正常情況下,某些數據如果是 null 將無法被搜尋, 因此這情況可以在 mapping 指定 ```null_value`` 在搜尋時,不能用空值查詢,而是要用 “null” 來查詢
CVT2HUGO: 為 null,並且要留意不能在 text 設定,只能在 keyword 設置
PUT try-mappings
{
"mappings": {
"properties" : {
"name" : {
"type" : "keyword",
"null_value": "null"
}
}
}
}