昨天我們提到可以對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