一、Dynamic templates
动态模板允许你定义可以用于动态添加的字段的自定义映射:
- 由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"
}
}
}