- 由Elasticsearch中的match_mapping_type检测到数据类型。
- 字段的名称可以是match(匹配)和unmatch(不匹配)或match_pattern(模式匹配)。
- 全点路径的字段可以是path_match(路径匹配)和path_unmatch(不匹配路径)。
原始字段名称 {name} 和检测导的数据类型 {dynamic_type} 模板变量可以在映射规范中用作占位符。
Tips
仅当字段包含具体值(不为空或空数组)时才添加动态字段映射。这意味着如果在dynamic_template中使用null_value选项,只能在该字段具有的具体值已被索引第一个文档之后才会应用该值。
动态模板是指定为命名对象的一个数组:
"dynamic_templates": [ { "my_template_name": { #1 ... match conditions ... #2 "mapping": { ... } #3 } }, ... ]
1、模板名称可以是任意字符串。
2、匹配条件可以包括以下任何一种:
match_mapping_type(匹配映射类型),
match(匹配),
match_pattern(模式匹配),
unmatch(不匹配),
path_match(路径匹配),
path_unmatch(取消路径匹配)。
3、匹配字段应该使用的映射。
模板按顺序进行处理-第一个匹配模板达到要求。可以使用PUT mapping API将新的模板附加到列表的尾部。如果新的模板与现有的模板同名,它将会替换旧的版本。
match_mapping_type(匹配映射类型)
match_mapping_type通过动态字段映射检测数据类型的匹配,换句话说,就是Elasticsearch认为该字段应该具有的数据类型。只能自动检测以下数据类型:boolean(布尔类型),date(日期),double(浮点型),long(长整型),object(对象类型),string(字符类型)。同时,它也接受*来匹配所有数据类型。
例如,如果我们要将所有整数字段映射为integer(整型)而不是long(长整型),并且所有string(字符串类型)字段都是text(文本)和keyword(关键词),我们可以使用以下模板:
PUT my_index { "mappings": { "my_type": { "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 my_index/my_type/1{ "my_integer": 5, #1 "my_string": "Some string" #2 }
1、my_integer字段被映射为integer(整数类型)。
2、my_string字段被映射为text(文本类型),并且是keword(关键字)多字段。 |
match and unmatch(匹配和不匹配)
match(匹配)参数使用模式匹配字段名称,而unmatch(不匹配)使用模式排除match(匹配)的字段。
以下示例匹配名称为long_开头(除了以_text结尾的字段字符串除外)的所有string(字符串类型)字段,并将其映射为long(长整型)字段:
PUT my_index { "mappings": { "my_type": { "dynamic_templates": [ { "longs_as_strings": { "match_mapping_type": "string", "match": "long_*", "unmatch": "*_text", "mapping": { "type": "long" } } } ] } }} PUT my_index/my_type/1 { "long_num": "5", #1 "long_text": "foo" #2 }
1、long_num字段被映射为long(长整型)。
2、long_text字段使用默认的string(字符串类型)映射。
二、自定义动态mapping如果觉得ES默认的mapping方式对于自己的业务来说还有优化空间,我们就可以自定义的动态mapping方式定制映射方式。
自定义三种方式 1、 根据字段类型mapping根据字段类型匹配通过 match_mapping_type 属性来控制,当添加文档的时候,ES的JsonParser解析出来的类型是match_mapping_type指定的类型,就会使用对应的mapping
{ "mappings": { "dynamic_templates": [ { "dt_name_one": { "match_mapping_type": "long", "mapping": { "type": "integer" } } }, { "dt_name_two": { "match_mapping_type": "string", "mapping": { "type": "text", "fields": { "raw": { "type": "keyword", "ignore_above": 256 } } } } } ] } }2、 根据字段名称mapping
根据字段名称映射使用的是 match、unmatch、match_pattern 属性来控制。
{ "mappings": { "dynamic_templates": [ { "longs_as_strings": { "match_mapping_type": "string", "match": "long_*", "unmatch": "*_text", "mapping": { "type": "long", "enable": false } } }, { "longs_as_strings": { "match_pattern": "regex", "match": "^profit_\d+$", "mapping": { "type": "long", "index": false, "norms": false, "doc_values": false } } } ] } }3、根据字段路径mapping
按路径匹配使用的是 path_match、path_unmatch 属性来指定。
{ "mappings": { "dynamic_templates": [ { "dt_path_name": { "path_unmatch": "user.*", "path_match": "*.conceal", "mapping": { "type": "text", "enable": false } } } ] } }三、动态mapping的添加方式
添加动态索引有2种方式:
第一种就是为索引添加mapping的时候同时指定动态映射的mapping。
第二种就是在索引模板中指定。
前面我们已经看了在添加索引mapping的时候指定,下面我们就来看一下在设置索引模板的时候指定。
四、索引模板{ "order": 0, // 模板优先级,数字越大优先级越高 "index_patterns": ["test*,user*"], // 匹配该模板的索引名称正则 "settings": {}, // 索引设置 "mappings": {}, // 索引中各字段的映射定义 "aliases": {} // 索引的别名 }
如上所示,就是在索引模板中最常见的属性了:
order:当索引名称匹配到多个索引模板的时候,换选择order值大的
index_patterns:索引名称匹配表达式,例如,所用以名称以test开头的都可以匹配到test*
settings:索引配置
mappings:默认的mapping
{ "order": 1, "index_patterns": [ "test*", "user*" ], "settings": { "number_of_shards": 1 }, "mappings": { "_source": { "enabled": false }, "dynamic_templates": [ { "string_as_keyword": { "match_mapping_type": "long", "mapping": { "type": "integer" } } } ], "properties": { "host_name": { "type": "keyword" }, "created_at": { "type": "date", "format": "yyyy-MM-dd" } } }, "aliases": { "alias_name": { "filter": { "term": { "user": "tim" } }, "routing": "tim" } } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)