若是你想在運行時增長新的字段,你可能會啓用動態映射。然而,有時候,動態映射 規則
可能不太智能。幸運的是,咱們能夠經過設置去自定義這些規則,以便更好的適用於你的數據。html
當 Elasticsearch 遇到一個新的字符串字段時,它會檢測這個字段是否包含一個可識別的日期,好比 2014-01-01
。若是它像日期,這個字段就會被做爲 date
類型添加。不然,它會被做爲 string
類型添加。app
有些時候這個行爲可能致使一些問題。想象下,你有以下這樣的一個文檔:spa
{"note": "2014-01-01"}
假設這是第一次識別 note
字段,它會被添加爲 date
字段。可是若是下一個文檔像這樣:code
{"note": "Logged out"}
這顯然不是一個日期,但爲時已晚。這個字段已是一個日期類型,這個 不合法的日期
將會形成一個異常。orm
日期檢測能夠經過在根對象上設置 date_detection
爲 false
來關閉:htm
PUT /my_index { "mappings": { "my_type": { "date_detection": false } } }
使用這個映射,字符串將始終做爲 string
類型。若是你須要一個 date
字段,你必須手動添加。對象
咱們能夠經過如下方式對日期格式的數據進行格式化:blog
PUT my_index { "mappings": { "my_type": { "properties": { "date": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" } } } } }
可使用 || 分隔多個格式 做爲分隔符。 將依次嘗試每種格式,直到找到匹配的格式。若是不指定,則使用默認格式:ci
"strict_date_optional_time||epoch_millis"
默承認以被解析的 date 類型格式以下所示:文檔
須要注意:以上默認日期類型是在未給定固定類型的狀況下,會按照默認方式自動匹配的。
使用 dynamic_templates
,你能夠徹底控制新檢測生成字段的映射。你甚至能夠經過字段名稱或數據類型來應用不一樣的映射。
每一個模板都有一個名稱,你能夠用來描述這個模板的用途, 一個 mapping
來指定映射應該怎樣使用,以及至少一個參數 (如 match
) 來定義這個模板適用於哪一個字段。
模板按照順序來檢測;第一個匹配的模板會被啓用。例如,咱們給 string
類型字段定義兩個模板:
es
:以 _es
結尾的字段名須要使用 spanish
分詞器。
en
:全部其餘字段使用 english
分詞器。
咱們將 es
模板放在第一位,由於它比匹配全部字符串字段的 en
模板更特殊:
PUT /my_index { "mappings": { "my_type": { "dynamic_templates": [ { "es": { "match": "*_es", -- (1) "match_mapping_type": "string", "mapping": { "type": "string", "analyzer": "spanish" } }}, { "en": { "match": "*", -- (2) "match_mapping_type": "string", "mapping": { "type": "string", "analyzer": "english" } }} ] }}}
匹配字段名以 _es
結尾的字段。
匹配其餘全部字符串類型字段。
match_mapping_type
容許你應用模板到特定類型的字段上,就像有標準動態映射規則檢測的同樣, (例如 string
或 long
)。
match
參數只匹配字段名稱, path_match
參數匹配字段在對象上的完整路徑,因此 address.*.name
將匹配這樣的字段:
{
"address": {
"city": {
"name": "New York"
}
}
}
unmatch
和 path_unmatch
將被用於未被匹配的字段。