Elasticsearch 入门到精通-Elasticsearch Dynamic templates(动态模板原理)

 一、Dynamic templates

动态模板允许你定义可以用于动态添加的字段的自定义映射:

  • 由Elasticsearch中的match_mapping_type检测到数据类型。
  • 字段的名称可以是match(匹配)和unmatch(不匹配)或match_pattern(模式匹配)。
  • 全点路径的字段可以是path_match(路径匹配)和path_unmatch(不匹配路径)。

原始字段名称 {name} 和检测导的数据类型 {dynamic_type} 模板变量可以在映射规范中用作占位符。

Tips

仅当字段包含具体值(不为空或空数组)时才添加动态字段映射。这意味着如果在dynamic_template中使用null_value选项,只能在该字段具有的具体值已被索引第一个文档之后才会应用该值。

动态模板是指定为命名对象的一个数组:

"dynamic_templates": [
    { 
        "my_template_name": {                 #1
         ... match conditions ...             #2 
        "mapping": { ... }                    #3
        } 
    }, 
... 
]

1、模板名称可以是任意字符串。

2、匹配条件可以包括以下任何一种:

        match_mapping_type(匹配映射类型),

        match(匹配),

        match_pattern(模式匹配),

        unmatch(不匹配),

        path_match(路径匹配),

        path_unmatch(取消路径匹配)。

3、匹配字段应该使用的映射。 

        模板按顺序进行处理-第一个匹配模板达到要求。可以使用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/my_type/1{
    "my_integer": 5,                 #1
    "my_string": "Some string"       #2
}     

1、my_integer字段被映射为integer(整数类型)。

2、my_string字段被映射为text(文本类型),并且是keword(关键字)多字段。 | 

match and unmatch(匹配和不匹配)

match(匹配)参数使用模式匹配字段名称,而unmatch(不匹配)使用模式排除match(匹配)的字段。

以下示例匹配名称为long_开头(除了以_text结尾的字段字符串除外)的所有string(字符串类型)字段,并将其映射为long(长整型)字段:

PUT my_index
{
  "mappings": {
    "my_type": {
      "dynamic_templates": [
        {
          "longs_as_strings": {
            "match_mapping_type": "string",
            "match":   "long_*",
            "unmatch": "*_text",
            "mapping": {
              "type": "long"
            }
          }
        }
      ]
    }
  }}

PUT my_index/my_type/1
{
  "long_num": "5",              #1
  "long_text": "foo"            #2
}          

1、long_num字段被映射为long(长整型)。

2、long_text字段使用默认的string(字符串类型)映射。 

二、自定义动态mapping

如果觉得ES默认的mapping方式对于自己的业务来说还有优化空间,我们就可以自定义的动态mapping方式定制映射方式。

自定义三种方式

1、 根据字段类型mapping

根据字段类型匹配通过 match_mapping_type 属性来控制,当添加文档的时候,ES的JsonParser解析出来的类型是match_mapping_type指定的类型,就会使用对应的mapping

{
    "mappings": {
        "dynamic_templates": [
            {
                "dt_name_one": {
                    "match_mapping_type": "long",
                    "mapping": {
                        "type": "integer"
                    }
                }
            },
            {
                "dt_name_two": {
                    "match_mapping_type": "string",
                    "mapping": {
                        "type": "text",
                        "fields": {
                            "raw": {
                                "type": "keyword",
                                "ignore_above": 256
                            }
                        }
                    }
                }
            }
        ]
    }
}

2、 根据字段名称mapping

根据字段名称映射使用的是 match、unmatch、match_pattern 属性来控制。

{
    "mappings": {
        "dynamic_templates": [
            {
                "longs_as_strings": {
                    "match_mapping_type": "string",
                    "match": "long_*",
                    "unmatch": "*_text",
                    "mapping": {
                        "type": "long",
                        "enable": false
                    }
                }
            },
            {
                "longs_as_strings": {
                    "match_pattern": "regex",
                    "match": "^profit_\\d+$",
                    "mapping": {
                        "type": "long",
                        "index": false,
                        "norms": false,
                        "doc_values": false
                    }
                }
            }
        ]
    }
}

3、根据字段路径mapping

按路径匹配使用的是 path_match、path_unmatch 属性来指定。

{
    "mappings": {
        "dynamic_templates": [
            {
                "dt_path_name": {
                    "path_unmatch": "user.*",
                    "path_match": "*.conceal",
                    "mapping": {
                        "type": "text",
                        "enable": false
                    }
                }
            }
        ]
    }
}

三、动态mapping的添加方式

添加动态索引有2种方式:
第一种就是为索引添加mapping的时候同时指定动态映射的mapping。
第二种就是在索引模板中指定。

前面我们已经看了在添加索引mapping的时候指定,下面我们就来看一下在设置索引模板的时候指定。

四、索引模板

{
  "order": 0,                            // 模板优先级,数字越大优先级越高
  "index_patterns": ["test*,user*"],     // 匹配该模板的索引名称正则
  "settings": {},                        // 索引设置
  "mappings": {},                        // 索引中各字段的映射定义
  "aliases": {}                          // 索引的别名
}

如上所示,就是在索引模板中最常见的属性了:
order:当索引名称匹配到多个索引模板的时候,换选择order值大的
index_patterns:索引名称匹配表达式,例如,所用以名称以test开头的都可以匹配到test*
settings:索引配置
mappings:默认的mapping

 {
    "order": 1,
    "index_patterns": [
        "test*",
        "user*"
    ],
    "settings": {
        "number_of_shards": 1
    },
    "mappings": {
        "_source": {
            "enabled": false
        },
        "dynamic_templates": [
            {
                "string_as_keyword": {
                    "match_mapping_type": "long",
                    "mapping": {
                        "type": "integer"
                    }
                }
            }
        ],
        "properties": {
            "host_name": {
                "type": "keyword"
            },
            "created_at": {
                "type": "date",
                "format": "yyyy-MM-dd"
            }
        }
    },
    "aliases": {
        "alias_name": {
            "filter": {
                "term": {
                    "user": "tim"
                }
            },
            "routing": "tim"
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值