重生之我们在ES顶端相遇第7 章- 动态映射 - dynamic template(动态模板)

146 阅读1分钟

思维导图

第7 章- 动态映射 - dynamic template(动态模板).png

前言

上一篇说的 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…