1.前述
在《动态映射》章节,我们知道,ES默认有一套映射规则,如果我们不想完全按照这套映射规则映射字段类型,也不想每个字段都自己指定。那么,可以使用动态模版(Dynamic template)
2.组成
定义动态模板,主要有以下部分组成:
"dynamic_templates": [{"my_template_name": {... match conditions ..."mapping": { ... }}},...]
模板名称:my_template_name
匹配规则:包括match_mapping_type, match, match_pattern, unmatch, path_match, path_unmatch.
目标映射:mapping,对于满足匹配规则的字段应用此映射
注意:动态模板按顺序处理,第一个匹配的模板将被应用。通过 put mapping API设置新的动态模板时,将覆盖所有现有模板。
3. 匹配规则
3.1 match_mapping_type
match_mapping_type是json解析器检测到的数据类型。由于JSON解析器不区分long与integer,或double与float,它总是选择更宽的数据类型,即long表示integer,double表示float。
ES默认支持以下自动映射:
| JSON输入 | 映射结果 |
|---|---|
| true、false | boolean |
| 启用日期检测并找到与配置的日期格式相匹配的字符串时 | date |
| 有小数部分的数字 | double |
| 没有小数部分的数字 | long |
| JSON对象 | object |
| 字符串 | string |
例如,如果要将所有integer类型字段映射为integer 而不是long,将所有string类型字段映射为text和keyword,则可以使用以下模板:
定义模板
PUT dynamic_templates_index{"mappings": {"_doc": {"dynamic_templates": [{"integers": {"match_mapping_type": "long","mapping": {"type": "integer"}}},{"strings": {"match_mapping_type": "string","mapping": {"type": "text","fields": {"raw": {"type": "keyword","ignore_above": 256}}}}}]}}}
插入文档
PUT dynamic_templates_index/_doc/1{"my_integer": 210000236,"my_string": "Some string"}
查询结果
3.2 match 和unmatch
match参数使用模式匹配字段名,而unmatch使用模式排除match匹配的字段。
以下示例匹配以long_开头的所有字符串字段(排除以_text结尾的字符串字段),并将其映射为long字段:
定义模板
PUT match_index{"mappings": {"_doc": {"dynamic_templates": [{"longs_as_strings": {"match_mapping_type": "string","match": "long_*","unmatch": "*_text","mapping": {"type": "long"}}}]}}}
插入文档:
PUT match_index/_doc/1{"long_num": "5","long_text": "foo"}
查询结果
3.3 match_pattern
匹配规则还支持java正则表达式,诸如:
"match_pattern": "regex","match": "^profit_\d+$"
3.4 path_match 和 path_unmatch
定义模板
将对象name中的所有字段,排除名称为middle字段映射为text数据类型,并将其复制到full_name对象中:
PUT path_match_index{"mappings": {"_doc": {"dynamic_templates": [{"full_name": {"path_match": "name.*","path_unmatch": "*.middle","mapping": {"type": "text","copy_to": "full_name"}}}]}}}
插入文档
GET path_match_index/_mapping
查询结果

