目錄html
索引模板: 就是把已經建立好的某個索引的參數設置(settings)和索引映射(mapping)保存下來做爲模板, 在建立新索引時, 指定要使用的模板名, 就能夠直接重用已經定義好的模板中的設置和映射.數據庫
(1) settings: 指定index的配置信息, 好比分片數、副本數, tranlog同步條件、refresh策略等信息;json
(2) mappings: 指定index的內部構建信息, 主要有:app
①
_all
: All Field字段, 若是開啓,_all
字段就會把全部字段的內容都包含進來,檢索的時候能夠不用指定字段查詢 —— 會檢索多個字段, 設置方式:"_all": {"enabled": true}
;elasticsearch在ES 6.0開始,
_all
字段被禁用了, 做爲替換, 能夠經過copy_to
自定義實現all字段的功能.ide②
_source
: Source Field字段, ES爲每一個文檔都保存一份源數據, 若是不開啓, 也就是"_source": {"enabled": false}
, 查詢的時候就只會返回文檔的ID, 其餘的文檔內容須要經過Fields字段到索引中再次獲取, 效率很低. 但若開啓, 索引的體積會更大, 此時就能夠經過Compress進行壓縮, 並經過inclueds
、excludes
等方式在field上進行限制 —— 指定義容許哪些字段存儲到_source
中, 哪些不存儲;性能③
properties
: 最重要的配置, 是對索引結構和文檔字段的設置.ui
索引模板通常用在時間序列相關的索引中.this
—— 也就是說, 若是你須要每間隔必定的時間就創建一次索引, 你只須要配置好索引模板, 之後就能夠直接使用這個模板中的設置, 不用每次都設置settings和mappings.code
索引模板通常與索引別名一塊兒使用. 關於索引別名, 後續研究以後再作補充.
建立一個商品的索引模板的示例:
(1) ES 6.0以前的版本:
PUT _template/shop_template { "template": "shop*", // 能夠經過"shop*"來適配 "order": 0, // 模板的權重, 多個模板的時候優先匹配用, 值越大, 權重越高 "settings": { "number_of_shards": 1 // 分片數量, 能夠定義其餘配置項 }, "aliases": { "alias_1": {} // 索引對應的別名 }, "mappings": { "_default": { // 默認的配置, ES 6.0開始再也不支持 "_source": { "enabled": false }, // 是否保存字段的原始值 "_all": { "enabled": false }, // 禁用_all字段 "dynamic": "strict" // 只用定義的字段, 關閉默認的自動類型推斷 }, "type1": { // 默認的文檔類型設置爲type1, ES 6.0開始只支持一種type, 因此這裏不須要指出 */ "_source": {"enabled": false}, "properties": { // 字段的映射 "@timestamp": { // 具體的字段映射 "type": "date", "format": "yyyy-MM-dd HH:mm:ss" }, "@version": { "doc_values": true, "index": "not_analyzed", // 不索引 "type": "string" // string類型 }, "logLevel": { "type": "long" } } } } }
(2) ES 6.0以後的版本:
PUT _template/shop_template { "index_patterns": ["shop*", "bar*"], // 能夠經過"shop*"和"bar*"來適配, template字段已過時 "order": 0, // 模板的權重, 多個模板的時候優先匹配用, 值越大, 權重越高 "settings": { "number_of_shards": 1 // 分片數量, 能夠定義其餘配置項 }, "aliases": { "alias_1": {} // 索引對應的別名 }, "mappings": { // ES 6.0開始只支持一種type, 名稱爲「_doc」 "_doc": { "_source": { // 是否保存字段的原始值 "enabled": false }, "properties": { // 字段的映射 "@timestamp": { // 具體的字段映射 "type": "date", "format": "yyyy-MM-dd HH:mm:ss" }, "@version": { "doc_values": true, "index": "false", // 設置爲false, 不索引 "type": "text" // text類型 }, "logLevel": { "type": "long" } } } } }
說明:
直接修改mapping的優先級 > 索引模板中的設置;
索引匹配了多個template, 當屬性等配置出現不一致時, 以模板的權重(order屬性的值)爲準, 值越大越優先, order的默認值是0.
ES 6.0以後的版本API變化較大, 請重點關注.
(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
刪除示例:
DELETE _template/shop_template // 刪除上述建立的模板
若是模板不存在, 將拋出以下錯誤:
{ "error" : { "root_cause" : [ { "type" : "index_template_missing_exception", "reason" : "index_template [shop_temp] missing" } ], "type" : "index_template_missing_exception", "reason" : "index_template [shop_temp] missing" }, "status" : 404 }
—— 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.
若是咱們只關心查詢的評分結果, 而不用查看原始文檔的內容, 就設置"_source": {"enabled": false}
.
—— 這能節省磁盤空間並減小磁盤IO上的開銷.
咱們能夠把原始的數據存儲在MySQL、HBase等數據庫, 從ES中獲得文檔的ID以後, 再到相應的數據庫中獲取數據.
若是可以確切地知道要對哪一個field作查詢操做, 就設置"_all": {"enabled": false}
.
—— 這能實現性能提高, 並節省存儲空間.
而在6.X版本開始, _all
字段也再也不支持了, ES官方建議咱們經過copy_to
自定義咱們本身的all字段.
若是咱們的數據是結構化數據, 就設置"dynamic": "strict"
.
—— 把動態類型判斷設置爲嚴格, 也就是不容許ES爲插入的數據進行動態類型設置, 避免注入髒數據.
若是咱們只關心精確匹配, 就設置test_field: {"type": "keyword"}
.
—— keyword類型要比text類型的性能更高, 而且還能節省磁盤的存儲空間.
參考資料
版權聲明
出處: 博客園 瘦風(https://www.cnblogs.com/shoufeng)
感謝閱讀, 若是文章有幫助或啓發到你, 點個[好文要頂👆] 或 [推薦👍] 吧😜
本文版權歸博主全部, 歡迎轉載, 但 [必須在文章頁面明顯位置標明原文連接], 不然博主保留追究相關人員法律責任的權利.