前言
动态模板允许您在默认动态字段映射规则之外更好地控制 Elasticsearch 如何映射您的数据。
可以通过将 dynamic 参数设置为 true
或 runtime
来启用动态映射。 然后,可以使用动态模板来定义可应用于基于匹配条件动态添加的字段的自定义映射:
match_mapping_type
对 Elasticsearch 检测到的数据类型进行操作matchh
(匹配) 和unmatchh(不匹配)
使用模板匹配字段名称path_match
(路径匹配) andpath_unmatch
(路径不匹配)
如果动态模板没有定义 match_mapping_type
、match
或 path_match
,它将不会匹配任何字段。 您仍然可以在批量请求的 dynamic_templates 部分按名称引用模板。
动态模板模板如下:
"dynamic_templates": [
{
"my_template_name": { #1
... match conditions ... #2
"mapping": { ... } #3
}
},
...
]
-
my_template_name
模板的名称 -
match conditions
匹配规则,匹配条件可以包括以下任何一项:match_mapping_type
(匹配映射类型),match
(匹配),match_pattern
(模式匹配),unmatch
(不匹配),path_match
(路径匹配),path_unmatch
(路径不匹配) -
mapping
:匹配后的mapping规则
模板按顺序进行处理-第一个匹配模板达到要求。可以使用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-000001/_doc/1
{
"my_integer": 5, #1
"my_string": "Some string" #2
}
my_integer
字段被映射为integer(整数类型)。my_string
字段被映射为text(文本类型),并且是keword(关键字)多字段。
match
and unmatch
(匹配和不匹配)
这里主要是对字段名称进行匹配处理。
例如我们想对所有string类型、以long开头、并不以text结尾的字段改成long类型,如下:
PUT my_index
{
"mappings": {
"_doc": {
"dynamic_templates": [
{
"longs_as_strings": {
"match_mapping_type": "string",
"match": "long_*",
"unmatch": "*_text",
"mapping": {
"type": "long"
}
}
}
]
}
}
}
PUT my-index-000001/_doc/1
{
"long_num": "5", #1
"long_text": "foo" #2
}
-
long_num
字段匹配为long
类型. -
long_text
字段还是使用string
类型.
match_pattern(模式匹配)
这里match还支持正则表达式,例如:
"match_pattern": "regex",
"match": "^profit_\d+$"
path_match
and path_unmatch
这里主要是针对对象类型(object)的匹配规则。path_match
和path_unmatch
参数的工作方式与match
和unmathc
相同,但是字段运行在完整的路径上,而不仅仅是最终的名称,例如:some_object.*.some_field
。