最近想寫一篇es的索引的一個設計,因爲設計的東西特別多,固然,elasticsearch的模板和動態映射也是其中的一個設計點,因此乾脆先來聊聊索引的模板和動態映射,模板,聽這個名字就至關於一些公共可用的東西能夠做爲全部索引的一個設置,html
本文爲博客園做者所寫: 一寸HUI,我的博客地址:https://www.cnblogs.com/zsql/正則表達式
這裏說明下,elasticsearch7.8的模板接口發生了一些變化,_template接口將在後期被廢棄(雖然還能使用,不推薦),因此本文不介紹這個接口。既然有廢棄的那確定有新的方式來玩模板了。sql
最詳細接介紹看官網:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/index-templates.html數組
如今模板分爲兩種模板,一個索引模板(index templates ),一個是組件模板(component templates),索引模板是告訴Elasticsearch如何在建立索引時配置索引的一種方法。模板是在建立索引以前配置的,當手動或經過索引文檔建立索引時,模板的基礎設置將用做建立索引。組件模板是可重用的構建塊,用於配置映射、設置和別名。使用組件模板來構造索引模板,組件模板不能直接應用於索引。索引模板能夠包含組件模板的集合,也能夠直接指定設置、映射和別名。組件模板的接口是:_component_template,而索引模板的接口是:_index_template,下面來個官方的例子,能夠明顯的看出來組件模板component_template1和other_component_template被索引模板經過參數composed_of被引用,因此索引模板template_1既包括本身的設置,又包括了兩個組件模板的設置,這樣就能夠輕鬆靈活的作組合,下降耦合性。app
PUT _component_template/component_template1
{
"template": {
"mappings": {
"properties": {
"@timestamp": {
"type": "date"
}
}
}
}
}
PUT _component_template/other_component_template
{
"template": {
"mappings": {
"properties": {
"ip_address": {
"type": "ip"
}
}
}
}
}
PUT _index_template/template_1
{
"index_patterns": ["te*", "bar*"],
"template": {
"settings": {
"number_of_shards": 1
},
"mappings": {
"_source": {
"enabled": false
},
"properties": {
"host_name": {
"type": "keyword"
},
"created_at": {
"type": "date",
"format": "EEE MMM dd HH:mm:ss Z yyyy"
}
}
},
"aliases": {
"mydata": { }
}
},
"priority": 10,
"composed_of": ["component_template1", "other_component_template"],
"version": 3,
"_meta": {
"description": "my custom"
}
}
經過上面的接收,應該就清楚了這兩個模板之間的關係,能夠用來幹嗎了。接下來一一介紹下這兩個模板。elasticsearch
先上官網:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/indices-templates-v1.htmlide
組件模板是構建索引模板的構建塊。好比指定索引映射、設置和別名等。ui
使用語法:spa
PUT /_component_template/<component-template>
索引模板能夠由多個組件模板組成。要使用組件模板,請在索引模板經過參數composed_of指定。組件模板僅做爲匹配索引模板的一部分。在任何的索引或者索引模板中定義的一些內容(設置,mapping等)都會覆蓋組件模板中與之相同的內容,也就是說組件模板等級最低了,容易被取代。組件模板的只會在索引建立的時候生效,修改組件模板不會對現有的索引有影響。下面介紹下組件模板請求體的一些參數:設計
參數名 | 參數介紹 |
template | 必須配置,表名是要應用的模板,能夠選擇包括映射、設置或別名配置 |
aliases | 配置可選,配置index的別名 |
mappings | 配置可選,配置index的mapping |
settings | 配置可選,配置index的一些通用配置 |
version | 配置可選,用於外部管理組件模板的版本號 |
_meta | 配置可選,用於配置一些介紹信息,好比用戶元數據 |
舉個例子,一看就懂:
PUT _component_template/template_1
{
"template": {
"settings": {
"number_of_shards": 1
},
"aliases": {
"alias1": {},
"alias2": {
"filter": {
"term": {
"user.id": "kimchy"
}
},
"routing": "shard-1"
},
"{index}-alias": {}
}
},
"version": 123,
"_meta": {
"description": "set number of shards to one",
"serialization": {
"class": "MyComponentTemplate",
"id": 10
}
}
}
先看官網:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/indices-put-template.html
使用語法:
PUT /_index_template/<index-template>
索引模板定義能夠定義設置、映射和別名等,而後經過匹配自動應用於新建的索引。Elasticsearch基於與索引名稱匹配的通配符模式將模板應用於新索引,也就是說經過索引進行匹配,看看新建的索引是否符合索引模板,若是符合,就將索引模板的相關設置應用到新的索引,若是同時符合多個索引模板呢,這裏須要對參數priority進行比較,這樣會選擇priority大的那個模板進行建立索引。在建立索引模板時,若是匹配有包含的關係,或者相同,則必須設置priority爲不一樣的值,不然會報錯。索引模板也是隻有在新建立的時候起到做用,修改索引模板對現有的索引沒有影響。一樣若是在索引中設置了一些設置或者mapping都會覆蓋索引模板中相同的設置或者mapping。接下來看看建立索引模板請求體的一些參數:
參數名稱 | 參數介紹 |
index_patterns | 必須配置,用於在建立期間匹配索引名稱的通配符(*)表達式數組 |
template | 可選配置,能夠選擇包括別名、映射或設置配置 |
composed_of | 可選配置,組件模板名稱的有序列表。組件模板按指定的順序合併,這意味着最後指定的組件模板具備最高的優先級 |
priority | 可選配置,建立新索引時肯定索引模板優先級的優先級。選擇具備最高優先級的索引模板。若是未指定優先級,則將模板視爲優先級爲0(最低優先級) |
version | 可選配置,用於外部管理索引模板的版本號 |
_meta | 可選配置,關於索引模板的可選用戶元數據。可能有任何內容 |
看這些,好像很複雜,舉個例子就容易了:(匹配全部te開頭的新建索引,分片爲1,優先級爲10)
PUT /_index_template/template_1
{
"index_patterns": [
"te*"
],
"template": {
"settings": {
"number_of_shards": 1
},
"aliases": {
"alias1": {},
"alias2": {
"filter": {
"term": {
"user.id": "kimchy"
}
},
"routing": "shard-1"
},
"{index}-alias": {}
},
"mappings": {
"_source": {
"enabled": true
}
}
},
"version": 123,
"priority": 10,
"_meta": {
"description": "set number of shards to three",
"serialization": {
"class": "MyIndexTemplate",
"id": 17
}
}
}
這裏沒有說組合索引的使用,請看第一節介紹部分,這兩種索引的關係,還有就是組合索引被引用順序,後者更具備更高的優先級,會覆蓋前面的一些組合索引的一些相同的設置,然而組件索引不一樣的部分將會疊加在一塊兒成爲索引模板的設置。語法確實不難,可是怎麼應用好呢,好比在elk中使用索引模板寫數據到es,好比索引設計,怎麼把索引自動滾動呢,這塊後期會有文章介紹,盡請期待。固然還有動態模板沒有介紹,繼續往下走。
注意:其實我的以爲把動態模板寫這裏是爲了區分索引模板和動態模板,由於我的混淆過,因此寫這裏比較好區別,其實動態模板不是索引模板,這裏不要誤會,其實動態模板就是能夠配置在索引中或者配置在索引模板中,做用是elasticsearch對數據探索自發現添加,能夠指定匹配,並映射成指定類型。這裏要記住elasticsearch只有組合模板和索引模板,動態模板時動態映射的一種實現。動態模板定義了索引建立後新添加字段的映射規則,而索引模板是在建立索引時默認爲索引添加的別名、配置和映射等信息。索引模板包含該模板適用索引的模式或規則,以及索引建立時默認包含的別名、配置和映射關係等。它們分別經過index_patterns、aliases、settings和mappings等四個參數設置
在說動態模板以前,先要說說動態映射。
Elasticsearch最重要的功能之一就是能夠自動探索數據。要爲文檔編制索引,沒必要首先建立索引、定義映射類型和定義字段,只需爲文檔編制索引,索引、類型和字段就會自動生成。
自動檢測和添加新字段以及字段類型稱爲動態映射,主要分爲動態字段和動態模板。這裏引出動態字段和動態模板,因此先看看動態字段。
先看官網:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/dynamic-field-mapping.html
默認狀況下,當在文檔中找到索引沒有定義的字段時,Elasticsearch會將新字段添加到類型映射中。經過將參數dynamic設置爲false(忽略新字段)或strict(遇到未知字段時引起異常),能夠在文檔和對象級別禁用此行爲。
假設啓用了動態字段映射,則使用一些簡單規則來肯定字段應具備的數據類型:固然不是全部的類型均可以自動映射的,只有field data types這些能夠動態的探索映射,因此其餘的數據類型須要顯示的指定。例如:
提及來可能比較有點很差理解,那就須要例子說明了:
PUT my-index-000001/_doc/1
{
"create_date": "2015/09/02"
}
GET my-index-000001/_mapping
這樣就自動把create_date在映射中添加了,而且字段類型爲date,這就是動態字段映射,也就是elasticsearch的一個特點,這樣就不要給全部的字段提早定義好,可是雖然方便了,可是不利於索引的管理,若是出現了一條異常的數據插入到索引中,這樣就會致使索引中的mapping中出現不少沒必要要的字段,動態字段映射能夠更具需求對其進行配置。
詳情見官網:https://www.elastic.co/guide/en/elasticsearch/reference/7.8/dynamic-templates.html
動態模板(Dynamic Template)用於自定義動態添加字段時的映射規則,可經過索引映射類型的dynamic_templates參數設置。該參數接收一組命名的動態模板,每個模板由匹配條件和映射規則組成。匹配條件定義了新字段是否可使用當前模板,可根據新字段的數據類型、名稱和路徑來定義條件;而映射規則由參數mapping定義,它須要給出新字段要使用哪些參數,可以使用type定義新字段數據類型。
使用規則以下:
使用語法:
"dynamic_templates": [
{
"my_template_name": { //這裏能夠隨便寫,便於辨別就好,
... match conditions ... //這裏就是上面說的規則,好比match_mapping_type
"mapping": { ... } //匹配字段使用的映射,意思就是把匹配到的內容映射爲你想要設置的內容
}
},
...
]
這裏只舉例說明一個規則或者說是條件:match_mapping_type
PUT my-index-000002
{
"mappings": {
"dynamic_templates": [
{
"integers": {
"match_mapping_type": "long",
"mapping": {
"type": "integer"
}
}
},
{
"strings": {
"match_mapping_type": "string",
"mapping": {
"type": "text",
"fields": {
"raw": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
]
}
}
PUT my-index-000002/_doc/1
{
"my_integer": 5,
"my_string": "Some string"
}
查看結果
其實靜下心來看也不難,其餘的規則能夠看官網的例子。