ES 10 - 如何使用Elasticsearch的索引模板(index template)


1 什么是索引模板

索引模板: 就是把已經創建好的某個索引的參數設置(settings)和索引映射(mapping)保存下來作為模板, 在創建新索引時, 指定要使用的模板名, 就可以直接重用已經定義好的模板中的設置和映射.

1.1 索引模板中的內容

(1) settings: 指定index的配置信息, 比如分片數、副本數, tranlog同步條件、refresh策略等信息;

(2) mappings: 指定index的內部構建信息, 主要有:

_all: All Field字段, 如果開啟, _all字段就會把所有字段的內容都包含進來,檢索的時候可以不用指定字段查詢 —— 會檢索多個字段, 設置方式: "_all": {"enabled": true};

在ES 6.0開始, _all字段被禁用了, 作為替換, 可以通過copy_to自定義實現all字段的功能.

_source: Source Field字段, ES為每個文檔都保存一份源數據, 如果不開啟, 也就是"_source": {"enabled": false}, 查詢的時候就只會返回文檔的ID, 其他的文檔內容需要通過Fields字段到索引中再次獲取, 效率很低. 但若開啟, 索引的體積會更大, 此時就可以通過Compress進行壓縮, 並通過incluedsexcludes等方式在field上進行限制 —— 指定義允許哪些字段存儲到_source中, 哪些不存儲;

properties: 最重要的配置, 是對索引結構和文檔字段的設置.

1.2 索引模板的用途

索引模板一般用在時間序列相關的索引中.

—— 也就是說, 如果你需要每間隔一定的時間就建立一次索引, 你只需要配置好索引模板, 以后就可以直接使用這個模板中的設置, 不用每次都設置settings和mappings.

索引模板一般與索引別名一起使用. 關於索引別名, 后續研究之后再做補充.

2 創建索引模板

創建一個商品的索引模板的示例:

(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變化較大, 請重點關注.

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	// 刪除上述創建的模板

如果模板不存在, 將拋出如下錯誤:

{
  "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
}

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}.

—— 這能實現性能提升, 並節省存儲空間.
而在6.X版本開始, _all字段也不再支持了, ES官方建議我們通過copy_to自定義我們自己的all字段.

5.4 設置dynamic = strict

如果我們的數據是結構化數據, 就設置"dynamic": "strict".

—— 把動態類型判斷設置為嚴格, 也就是不允許ES為插入的數據進行動態類型設置, 避免注入臟數據.

5.5 使用keyword類型

如果我們只關心精確匹配, 就設置test_field: {"type": "keyword"}.

—— keyword類型要比text類型的性能更高, 並且還能節省磁盤的存儲空間.


參考資料

官方文檔(6.6) - Index Templates

初探 Elasticsearch Index Template(索引模板)

Elasticsearch之索引模板index template與索引別名index alias

版權聲明

作者: 瘦風(https://healchow.com)

出處: 博客園 瘦風(https://www.cnblogs.com/shoufeng)

感謝閱讀, 如果文章有幫助或啟發到你, 點個[好文要頂👆] 或 [推薦👍] 吧😜

本文版權歸博主所有, 歡迎轉載, 但 [必須在文章頁面明顯位置標明原文鏈接], 否則博主保留追究相關人員法律責任的權利.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM