思维导图
前言
上一篇说的 dynamic mapping, 当字段不存在时,会按照一定的规则去映射字段类型。 而 dynamic template 则允许你修改这一规则。
PS:开发中几乎不用。为了知识体系的完善,本文章只做简单介绍,更多详细内容可自行阅读 官方文档[1]。
基本使用
该功能有以下几个主要参数控制映射行为。
- • match_mapping_type:字段在 JSON 中的类型。
- • match、unmatch:匹配字段名
- • path_match、path_unmatch:匹配
object字段名称。例如name.firstName。
match_mapping_type
PUT test5
{
"mappings": {
"dynamic_templates": [
{
"strings_mapping": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
]
}
}
# 写入测试数据
POST test5/_doc
{
"name": "csp"
}
# 查询 Mapping
GET test5/_mapping
如果字段类型为 string, 则将其映射为 keyword。 其中 strings_mapping 为我们自定义的名称。
match、unmatch
# 删除
DELETE test5
PUT test5
{
"mappings": {
"dynamic_templates": [
{
"longs_as_strings": {
"match_mapping_type": "string",
"match": "long_*",
"unmatch": "*_text",
"mapping": {
"type": "long"
}
}
}
]
}
}
# 写入测试数据
PUT test5/_doc/1
{
"long_num": "5",
"long_text": "foo"
}
# 查询 mapping
GET test5/_mapping
上面的意思为:如果字段类型为 string,名称是以 long_ 开头,并且不以 _text 结尾的,都将字段类型映射为 long。
path_match、path_unmatch
PUT test5
{
"mappings": {
"dynamic_templates": [
{
"full_name": {
"path_match": "name.long_*",
"path_unmatch": "name.*_text",
"mapping": {
"type": "long"
}
}
}
]
}
}
PUT test5/_doc/1
{
"name.long_num": "5",
"name.long_text": "foo"
}
该写法等同于以下写法
PUT test5/_doc/2
{
"name" : {
"long_num": "5",
"long_text": "foo"
}
}
GET test5/_mapping
上面的意思为:如果字段类型为 string,名称是以 name.long_ 开头,并且不匹配name.*_text 的,都将字段类型映射为 long。 与 match、unmatch 区别为:它用于 object 字段名称匹配。
引用链接
[1] 官方文档: www.elastic.co/guide/en/el…