若是你想在运行时增长新的字段,你可能会启用动态映射。然而,有时候,动态映射 规则
可能不太智能。幸运的是,咱们能够经过设置去自定义这些规则,以便更好的适用于你的数据。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
将被用于未被匹配的字段。