《Elastic Stack 实战手册》——三、产品能力——3.4.入门篇——3.4.2.Elasticsearch基础应用——3.4.2.10.Dynamic Mapping(5) https://developer.aliyun.com/article/1230514
path_match 、 path_unmatch
在 Elasticsearch 中存储的文档允许有内嵌对象,当还有多层内嵌对象时,属性一般有路径的概念。属性的路径也可以作为匹配的条件。这个配置的用法与match和unmatch雷同,但需要注意的是match和unmatch仅作用于最后一级的属性名。
如下模板表示设置person内嵌对象除了age外其它所有以long_开头的字段新增时类型设为
text。
PUT test-dynamic-mapping { "mappings": { "dynamic_templates": [ { "test_float": { "match_pattern": "long_", # 以 long_ 开头 "path_match": "person.*", # 内嵌对象 person 所有字段 "path_unmatch": "*.age" # 排除 age 字段 "mapping": { "type": "text" # 字段 type 设为 text } } } ] } }
其它技巧及注意事项
在日常生产中难免有这样的需求,字段是什么类型就将类型设为什么,字段名是什么就用什么解析器。对于这种需求我们在配置动态模板的mapping时,可以使用占位符{name} 表示字段名,用 {dynamic_type}表示识别出的字段类型 。
比如下面 2 个模板一起表示的意思是,所有新增字符串类型字段,其解析器是字段的名称,所有其他类型字段新增时,类型就设为识别的字段类型,但是doc_value设为 false.
PUT test-dynamic-mapping { "mappings": { "dynamic_templates": [ { "named_analyzers": { # 字段名即是该字段的解析器名称 "match_mapping_type": "string", # 匹配所有 string 类型 "match": "*", # 匹配任意属性名 "mapping": { "type": "text", "analyzer": "{name}" # 解析器是字段名 } } }, { "no_doc_values": { # 匹配所有类型,但匹配string的在前,所以 实际匹配除string的其他所有字段 "match_mapping_type":"*", "mapping": { "type": "{dynamic_type}", # 类型直接作为type "doc_values": false } } } ] } } PUT test-dynamic-mapping/_doc/1 { "english": "Some English text", # 该字段是新字段,会在mapping中新增会用english解析器 "count": 5 # 该字段的类型会是 long, doc_values为false }
在使用动态模板时,还有以下几点需要注意。
1、所有null值及空数组属于无效值,不会被任何动态模板匹配,在索引文档时,只有字段第一次有有效值时,才会与各动态模板匹配,找出匹配的模板创建新字段。
2、规则匹配时,按照动态模板配置的顺序依次对比,使用最先匹配成功的模板,这就意味着如果有字段同时符合 2 个动态模板,那么会使用在dynamic_templates数组中靠前的那个。每个动态模板的匹配方式至少应包含match、path_match、match_mapping_type中的一个,
unmatch和path_unmatch不能单独使用。
3、mapping的dynamic_templates字段是可以在运行时修改的,每次修改会整体替换dynamic_templates的所有值而非追加。
比如下面的请求就是将映射test-dynamic-mapping原来的动态模板配置删除,并配一个名为newTemplate的动态模板。
PUT test-dynamic-mapping/_mapping { "dynamic_templates": [ { "newTemplate": { "match": "abc*", "mapping": { "type": "keyword" } } } ] }
创作人简介:
骆潇龙,高级 Java 开发工程师,关注大数据技术领域。
博客:https://blog.gaiaproject.club/