Dynamic Template(动态模板)是 Elasticsearch 中用于自动化管理动态新增字段映射的工具:
- 作用:替代 ES 默认的字段类型猜测规则,按自定义逻辑为 "未显式定义的新字段" 指定映射
- 核心价值:避免 ES 自动映射产生的不合理类型(比如把数字字符串映射为 text),减少后期重建索引的成本;
- 生效时机:仅对 "写入时动态新增的字段" 生效,已显式定义的字段不受影响。
基于字段类型
下面的例子中展示了这个功能:
当 Elasticsearch 自动检测字段类型为 long 时(比如写入数值 18 200 这类整数),不会使用默认的 long 类型,而是强制映射为 integer 类型。
PUT test_dynamic_template
{
"settings": {
"number_of_replicas": 1,
"number_of_shards": 50
},
"mappings": {
"dynamic_templates": [
{
"integer_type_mapping_hdk_test_name": {
"match_mapping_type": "long",
"mapping": {
"type": "integer"
}
}
}
]
}
}
字段名称匹配机制
通过设定名称的匹配机制,解释match,unmatch,match_mapping_type规则实现根据名称的动态模板设置。
PUT test_dynamic_template
{
"settings": {
"number_of_replicas": 1,
"number_of_shards": 50
},
"mappings": {
"dynamic_templates": [
{
"income1": {
"match": "income1*",
"mapping": {
"type": "integer"
}
}
},
{
"income2": {
"match": "income2*",
"mapping": {
"type": "long"
}
}
},
{
"income3": {
"match_mapping_type":"string",
"unmatch": "income*",
"mapping": {
"type": "ip"
}
}
}
]
}
}
注意,unmatch不能单独使用,需要和match或者是match_mapping_type结合使用。
字段路径匹配机制
通过path_match字段进行设置,下面的例子展示了我们设定之后, 插入的数据类型判断为keyword类型。
PUT test_dynamic_template
{
"mappings": {
"dynamic_templates":[
{
"path_user_mapping_test":{
"path_match":"user.*",
"mapping":{
"type":"keyword"
}
}
}
]
}
}
PUT test_dynamic_template/_doc/1
{
"user":{
"income11111":342,
"income231":57293845,
"shijian":"127.0.0.1"
}
}
GET test_dynamic_template/_mapping
{
"test_dynamic_template": {
"mappings": {
"dynamic_templates": [
{
"path_user_mapping_test": {
"path_match": "user.*",
"mapping": {
"type": "keyword"
}
}
}
],
"properties": {
"user": {
"properties": {
"income11111": {
"type": "keyword"
},
"income231": {
"type": "keyword"
},
"shijian": {
"type": "keyword"
}
}
}
}
}
}
}