昨天我們提到可以對Dynamic出來的欄位類型進行調整,我們就來看是怎麼樣運作的吧~
基礎模板:
PUT /my_dynamic_template
{
"mappings": {
"dynamic_templates" : [
{
"strings": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
]
}
}
在dynamic_templates array中index=0的key值自己設定想取的名字
然後在match_mapping_type設定好在偵測到哪種類型的資料時,要mapping成哪種type
接著輸入資料,並查看mapping
POST /my_dynamic_template/_doc
{
"id": "k123456"
}
GET /my_dynamic_template/_mapping
可以看到已經設置成我們預先設定好的keyword type
設置match與unmatch
PUT /my_dynamic_template
{
"mappings": {
"dynamic_templates" : [
{
"string_only_text": {
"match_mapping_type": "string",
"match": "text_*",
"unmatch": "*_keyword",
"mapping": {
"type": "text"
}
}
}
]
}
}
在match與unmatch中除了用wildcard也可以用正規表達式,讓設定更靈活
並且如果有多個能匹配的條件,會優先採用第一個滿足的
設置path_match與path_unmatch
PUT /my_dynamic_template
{
"mappings": {
"dynamic_templates" : [
{
"name_determine": {
"match_mapping_type": "string",
"path_match": "student.info.name",
"mapping": {
"type": "keyword"
}
}
},
{
"desc_determine": {
"match_mapping_type": "string",
"path_unmatch": "student.info.name",
"mapping": {
"type": "text"
}
}
}
]
}
}
path_match表示在student欄位下中info這個object內
符合key為name的時候要設定string的資料為keyword,反之如果key為其他的就是text
輸入文檔:
POST /my_dynamic_template/_doc
{
"student": {
"info": {
"name": "Eason",
"desc": "he is a good student"
}
}
}
最後還有這種
使用dynamic_type佔位符將會替換成ES檢測到的數據類型
最終就會存成之前表格提到預設dynamic的儲存格式
讓你可以部分自己設定,部分由ES處理
PUT /my_dynamic_template
{
"mappings": {
"dynamic_templates" : [
{
"score_determine": {
"match_mapping_type": "long",
"path_match": "student.info.math_score",
"mapping": {
"type": "{dynamic_type}"
}
}
}
]
}
}
有關Dynamic templates的部分就先這樣~
後面要再介紹runtime時會再帶到其他需要注意的事項
我們明天會對一些在開發時實際上遇到的問題會用到的API進行介紹~
參考資料
Dynamic templates: https://www.elastic.co/guide/en/elasticsearch/reference/current/dynamic-templates.html