阅读完需:约 3 分钟
动态模板允许你定义可以用于动态添加的字段的自定义映射:
- 由Elasticsearch中的match_mapping_type检测到数据类型。
- 字段的名称可以是match(匹配)和unmatch(不匹配)或match_pattern(模式匹配)。
- 全点路径的字段可以是path_match(路径匹配)和path_unmatch(不匹配路径)。
动态模板是指定为命名对象的一个数组:
"dynamic_templates": [
{
"my_template_name": { #1
... match conditions ... #2
"mapping": { ... } #3
}
},
...
]
模板按顺序进行处理-第一个匹配模板达到要求。可以使用PUT mapping API将新的模板附加到列表的尾部。如果新的模板与现有的模板同名,它将会替换旧的版本。
match_mapping_type(匹配映射类型)
match_mapping_type通过动态字段映射检测数据类型的匹配,换句话说,就是Elasticsearch认为该字段应该具有的数据类型。
只能自动检测以下数据类型:boolean(布尔类型),date(日期),double(浮点型),long(长整型),object(对象类型),string(字符类型)。同时,它也接受*来匹配所有数据类型。
match
and unmatch(匹配和不匹配)
match(匹配)参数使用模式匹配字段名称,而unmatch(不匹配)使用模式排除match(匹配)的字段。
以上两个的例子:
PUT blog
{
"mappings": {
"dynamic_templates":[
{
"longandinteger":{
"match_mapping_type":"long",
"mapping":{
"type":"integer"
}
}
}
]
}
}
PUT blog/_doc/1
{
"count":99
}
将long类型的映射成了integer类型
PUT blog
{
"mappings": {
"dynamic_templates":[
{
"stringandinteger":{
"match_mapping_type":"string",
"match":"num_*",
"unmatch":"*_text",
"mapping":{
"type":"integer"
}
}
}
]
}
}
PUT blog/_doc/1
{
"num_count":"8888",
"num_text":"java"
}
num_aaa,还是long类型,因为它一开始就没有进入判断
PUT blog/_doc/2
{
"num_count":"8888",
"num_text":"java",
"num_aaa":8999
}
match_pattern(模式匹配)
match_pattern参数调整match参数的行为,使其在字段名称上支持匹配完整的Java正则表达式,而不是简单的通配符,例如:
"match_pattern": "regex",
"match": "^profit_\d+$"
path_match
and path_unmatch(路径匹配和不匹配路径)
path_match和path_unmatch参数的工作方式与match和unmathc相同,但是字段运行在完整的路径上,而不仅仅是最终的名称
例如:some_object.*.some_field。
此示例将name对象中的任何字段的值复制到顶级full_name字段,但middle字段除外:
PUT my_index
{
"mappings": {
"my_type": {
"dynamic_templates": [
{
"full_name": {
"path_match": "name.*",
"path_unmatch": "*.middle",
"mapping": {
"type": "text",
"copy_to": "full_name"
}
}
}
]
}
}}
PUT my_index/my_type/1{
"name": {
"first": "Alice",
"middle": "Mary",
"last": "White" }}
{name}
and {dynamic_type}
占位符
在映射中{name}和{dynamic_type}占位符会被替换为字段名称和检测到的动态类型。
以下示例将所有的字符串类型设置为使用与该字段名称相同的analyzer(分析器),并禁用所有非字符串字段的doc_values:
PUT my_index
{
"mappings": {
"my_type": {
"dynamic_templates": [
{
"named_analyzers": {
"match_mapping_type": "string",
"match": "*",
"mapping": {
"type": "text",
"analyzer": "{name}"
}
}
},
{
"no_doc_values": {
"match_mapping_type":"*",
"mapping": {
"type": "{dynamic_type}",
"doc_values": false
}
}
}
]
}
}}
PUT my_index/my_type/1{
"english": "Some English text", #1
"count": 5 } #2
english字段通过english分析器映射为string(字符串)字段。 count字段通过禁用的doc_values映射为long(长整型)字段。
更多查看文档: