索引模板就是將已經創建好的某個索引參數設置(settings)和索引映射(mapping)保存下來作為模板, 在創建新索引時, 指定使用某個模板就可以直接使用已經定義好的設置和映射. ...
目錄
1 索引模板概述
1.1 什麼是索引模板
索引模板: 就是把已經創建好的某個索引的參數設置(settings)和索引映射(mapping)保存下來作為模板, 在創建新索引時, 指定要使用的模板名, 就可以直接重用已經定義好的模板中的設置和映射.
1.2 索引模板中的內容
(1) settings: 指定index的配置信息, 比如分片數、副本數, tranlog同步條件、refresh策略等信息;
(2) mappings: 指定index的內部構建信息, 主要有:
①
_all
: All Field欄位, 如果開啟,_all
欄位就會把所有欄位的內容都包含進來,檢索的時候可以不用指定欄位查詢 —— 會檢索多個欄位, 設置方式:"_all": {"enabled": true}
;
②_source
: Source Field欄位, Elasticsearch中為每個文檔都保存一份源數據, 如果不開啟, 也就是"_source": {"enabled": false}
, 查詢的時候就只會返迴文檔的ID, 其他的文檔內容需要通過Fields欄位到索引中再次獲取數據, 效率很低. 但若開啟, 索引數據的體積會更大, 此時就可以通過Compress進行壓縮, 並通過inclueds
、excludes
等方式在field上進行限制 —— 指定義允許哪些欄位存儲到_source
中, 哪些不存儲;
③properties
: 最重要的配置, 是對索引結構和文檔欄位的設置.
1.3 索引模板的用途
索引模板一般用在時間序列相關的索引中.
—— 也就是說, 如果你需要每間隔一定的時間就建立一次索引, 你只需要配置好索引模板, 以後就可以直接使用這個模板中的設置, 不用每次都設置settings和mappings.
索引模板一般與索引別名一起使用.
2 創建索引模板
創建示例: 創建一個商品的索引模板:
PUT _template/shop_template
{
"template": "shop*", // 可以通過"shop*"來適配
"order": 0, // 模板的權重, 多個模板的時候優先匹配用, 值越大, 權重越高
"settings": {
"number_of_shards": 1 // 分片數量, 可以定義其他配置項
},
"aliases": {
"alias_1": {} // 索引對應的別名
},
"mapping": {
"_default": { // 預設的配置
"_source": { "enabled": false }, // 是否保存欄位的原始值
"_all": { "enabled": false }, // 禁用_all欄位
"dynamic": "strict" // 只用定義的欄位, 關閉預設的自動類型推斷
},
"type1": { // 預設的文檔類型設置為type1
"_source": {"enabled": false},
"properties": { // 欄位的映射
"@timestamp": { // 具體的欄位映射
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
},
"@version": {
"doc_values": true,
"index": "not_analyzed",
"type": "string"
},
"LogLevel": {
"type": "long"
}
}
}
}
}
說明:
直接修改mapping的優先順序 > 索引模板中的設置;
索引匹配了多個template, 當屬性等配置出現不一致時, 以模板的權重(order屬性的值)為準, 值越大越優先, order的預設值是0.
3 查看索引模板
(1) 查看示例:
GET _template // 查看所有模板
GET _template/temp* // 查看與通配符相匹配的模板
GET _template/temp1,temp2 // 查看多個模板
GET _template/shop_template // 查看指定模板
(2) 判斷模板是否存在:
判斷示例:
HEAD _template/shop_tem
結果說明:
a) 如果存在, 響應結果是:
200 - OK
b) 如果不存在, 響應結果是:
404 - Not Found
4 刪除索引模板
刪除示例:
DELETE _template/shop_template // 刪除上述創建的模板
如果模板不存在, 響應結果將是空集{}
.
5 模板的使用建議
5.1 一個index中不能有多個type
—— Elasticsearch 6.X版本中已經不支持在同一個index下創建多個type.
6.X之前的版本中, 父子文檔的實現是一個索引中定義多個type, 6.X中實現方式改變為join方式.
如果在同一個index下創建多個type, 會報出如下錯誤信息:
{
"error": {
"root_cause": [
{
"type": "illegal_argument_exception",
"reason": "Rejecting mapping update to [book_shop] as the final mapping would have more than 1 type: [books, novel_book]"
}
],
"type": "illegal_argument_exception",
"reason": "Rejecting mapping update to [book_shop] as the final mapping would have more than 1 type: [books, novel_book]"
},
"status": 400
}
錯誤信息指出: 拒絕對[book_shop]的mapping信息進行修改, 因為它作為final mapping(最終態的mapping), 將會有超過2個type.
5.2 設置_source = false
如果你只關心度量結果, 而不是原始文檔的內容, 就設置"_source": {"enabled": false}
.
—— 這能節省磁碟空間並減少磁碟IO上的開銷.
你可以把原始的數據存儲在MySQL、HBase等資料庫, 從ES中得到文檔的ID之後, 再到相應的資料庫中獲取數據.
5.3 設置_all = false
如果你確切地知道你要對哪個field做查詢操作, 就設置"_all": {"enabled": false}
.
—— 這能實現性能提升, 並節省存儲空間.
5.4 設置dynamic = strict
如果你的數據是結構化數據, 就設置"dynamic": "strict"
.
—— 把動態類型判斷設置為嚴格, 也就是不允許Elasticsearch為插入的數據進行動態類型設置, 避免註入臟數據.
5.5 使用keyword類型
如果你只關心精確匹配, 就設置UR_Field: {"type": "keyword"}
.
—— 這能提高性能, 並節省磁碟的存儲空間.
參考資料
版權聲明
作者: ma_shoufeng(馬瘦風)
出處: 博客園 馬瘦風的博客
您的支持是對博主的極大鼓勵, 感謝您的閱讀.
本文版權歸博主所有, 歡迎轉載, 但請保留此段聲明, 併在文章頁面明顯位置給出原文鏈接, 否則博主保留追究相關人員法律責任的權利.