我打算建立新的 Index 存放週、月歷史資料,但用到的欄位跟日歷史資料 99% 一致,只有成交量的資料格式要修改,每次建類似或相同的 Index 要重新複制貼上 Mapping 也太蠢。Index Template 就可以用來解決這個問題。
Index Template 顧名思義,就是 Index 的模板。在新建立 Index 時,我們必須給定 Setting 與/或 欄位的 Mappings,如果這些 Setting/Mappings 是之後其化 Index 可以重覆使用的,就可以抽出來變成模板。是不是跟物件導向的概念挺像的。
在 Elasticsearch 新增 Index Template 很簡單,透過 Tempate API,並為 Tempalte 取個名字
PUT /_template/history-prices-template
Index Tempate 要發揮作用,Index Patterns 屬性是重要關鍵,Index Pattern 是 wildcard expression,它會在建立新的 Index 時去判斷, Index 的命名是如符合 Index Pattern。舉個例子:
PUT /_template/history-prices-template
{
"index_patterns": ["history-prices-*"],
...
}
在上面的程式中,我定義了一個 Index Pattern,之後我打算建立的 Index 如:
打開 ES Cloud 上的 Kibana,打開 Dev Tools,寫個完整的 Index Template:
PUT /_template/history-prices-template
{
"index_patterns": ["history-prices-*"],
"mappings": {
"properties": {
"close" : {
"type" : "float"
},
"date" : {
"type" : "date"
},
"high" : {
"type" : "float"
},
"low" : {
"type" : "float"
},
"open" : {
"type" : "float"
},
"stock_id" : {
"type" : "keyword"
},
"volume" : {
"type" : "integer"
}
}
}
}
然後新建一個 Index,取回它的 Mapping 來看看:
PUT /history-prices-week
GET /history-prices-sma/_mapping
沒問題! But...
還記得我在 Day06 時考量過成交量欄位的資料格式,原本的定義是 Integer,但在新的 Index 中要改成 Double ,卻被 Template 設成 Integer 了,怎辦?
莫慌, Template 中的欄位是可以 Override 的,只要在建立 Index 時添加要改的欄位即可:
PUT /history-prices-week
{
"mappings": {
"properties": {
"volume" : {
"type" : "double"
}
}
}
}
GET /history-prices-sma/_mapping
明天要推進啥呢? 我決定先睡一覺再來想。 鐵人賽真的硬…