橘子学ES17之Index Template和Dynamic Template

21 篇文章 0 订阅

本文来学习一下Index Template和Dynamic Template。
Template就是模板的意思,其实这里我更愿意把他称之为模具,他是索引的模具,是为了更好的创建索引使用的。
有这么一种情况,随着项目不断发展,你的ES集群上有很多很多的索引被创建。但是手动创建都有这么个问题,就是你会粗心,可能你创建一个索引的时候忘记指定了分片等设置,这就导致最后的索引创建不正确。
这时候ES为我们提供了一种叫做索引模板的东西(Index Template),我们可以预先创建好模板,以后创建索引的时候就直接套模板。下面就来看看。

一、Index Template

1、什么是Index Template

Index Template是帮助你设置Mappings和Settings的,并按照一定的规则,自动匹配到新创建的索引之上。他具备以下性质。

  • 模板仅在一个索引创建时候才会生效,修改模板不会影响已经创建好的索引。
  • 你可以设定多个索引模板,这些设置可以通过操作"merge"合并到一起。
  • 你可以指定"order"的数值,来控制合并时候的先后顺序。

2、简单例子

创建一个默认的索引看下规则

PUT _template/template_default
{
  "index_patterns": ["*"],  所有的索引*
  "order" : 0,           合并顺序为0
  "version": 1,
  "settings": {          模板规则如下
    "number_of_shards": 1,  # 主分片为1
    "number_of_replicas":1  # 副本分片也是1
  }
}

这个索引模板的效果就是,每次我们创建索引的时候,
他匹配所有的索引,任何一个创建出来的索引其主分片都是1,
副本分片也是1
PUT /_template/template_test
{
    "index_patterns" : ["test*"],所有以test开头的索引都匹配这个
    "order" : 1,
    "settings" : {
    	"number_of_shards": 1, 
        "number_of_replicas" : 2
    },
    "mappings" : {
    	"date_detection": false, 这个模板创建出来的匹配date字符串成date类型这个是关闭的动态推测类型
    	"numeric_detection": true  数字字符串匹配类型是开启的
    }
}

3、Index Template的工作方式

Index Template的生效规则如下:当一个索引被创建的时候。

  • 应用ES默认的setting和mappings
  • 应用order数值低的Index Template中的设定
  • 应用order高的Index Template中的设定,之前的设定被之后的设定覆盖
  • 应用创建索引的时候,用户自己指定的setting和mappings,并且会覆盖之前模板的设定。

4、索引模板实操

1、创建两个模板
一个是匹配所有的,一个是只匹配test开头的。order分别是0,1

PUT _template/template_default
{
  "index_patterns": ["*"],
  "order" : 0,
  "version": 1,
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas":1
  }
}

PUT /_template/template_test
{
    "index_patterns" : ["test*"],
    "order" : 1,
    "settings" : {
    	"number_of_shards": 1,
        "number_of_replicas" : 2
    },
    "mappings" : {
    	"date_detection": false,
    	"numeric_detection": true
    }
}

2、查看索引模板的语法

#查看template信息
GET /_template/template_default  指定名称查
GET /_template/temp*   按照前缀匹配查,后中缀也可以

3、插入文档

#写入新的数据,index以test开头
PUT testtemplate/_doc/1
{
	"someNumber":"1",
	"someDate":"2019/01/01"
}
这个索引会匹配上面两个,顺序是order小的先,所以test的规则会被匹配。
查看一下这个索引的mapping和setting如下:
GET testtemplate/_mapping结果如下
{
  "testtemplate" : {
    "mappings" : {
      "date_detection" : false,
      "numeric_detection" : true,
      "properties" : {
        "someDate" : {  日期的被关闭了,识别成了text
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },
        "someNumber" : { 数字的还开着,虽然插入文档是字符串,但是被动态识别成了long
          "type" : "long"
        }
      }
    }
  }
}
GET testtemplate/_settings settings结果如下
{
  "testtemplate" : {
    "settings" : {
      "index" : {
        "creation_date" : "1658568366613",
        "number_of_shards" : "1",
        "number_of_replicas" : "2",
        "uuid" : "y7-rXrr5QHK_ZcwAdugJiw",
        "version" : {
          "created" : "7010099"
        },
        "provided_name" : "testtemplate"
      }
    }
  }
}
主副本都是按照模板生成的规则。

4、插入文档的时候,自己指定mapping

插入索引
PUT testmy
{
	"settings":{
		"number_of_replicas":5
	}
}
给索引插入文档
PUT testmy/_doc/1
{
  "key":"value"
}
查看一下索引的setting
GET testmy/_settings结果如下
{
  "testmy" : {
    "settings" : {
      "index" : {
        "creation_date" : "1658568688452",
        "number_of_shards" : "1",
        "number_of_replicas" : "5",
        "uuid" : "YMvHRKDJQz2sKD5SP-Iirg",
        "version" : {
          "created" : "7010099"
        },
        "provided_name" : "testmy"
      }
    }
  }
}
我们看到配置是按照用户指定的生效的。覆盖了所有的模板指定。

5、删除历史数据

DELETE testmy
DELETE /_template/template_default
DELETE /_template/template_test

二、Dynamic Template

1、什么是Dynamic Template

翻译一下就是动态模板。
其作用是根据ES识别的数据类型,结合你字段名称的命名方式,来动态设定字段类型。打个比方。
1、你可以把所有的字符串类型都设定为keyword,或者干脆关闭keyword。
2、is开头的字段你可以设置成布尔类型。
3、long_开头的你可以设置成long类型、
你就可以让文档中的类型推断符合你自己的预期。

这个东西用的不多,后面回来搞定这里。TODO

#Dynaminc Mapping 根据类型和字段名
DELETE my_index

PUT my_index/_doc/1
{
  "firstName":"Ruan",
  "isVIP":"true"
}

GET my_index/_mapping
DELETE my_index
PUT my_index
{
  "mappings": {
    "dynamic_templates": [
            {
        "strings_as_boolean": {
          "match_mapping_type":   "string",
          "match":"is*",
          "mapping": {
            "type": "boolean"
          }
        }
      },
      {
        "strings_as_keywords": {
          "match_mapping_type":   "string",
          "mapping": {
            "type": "keyword"
          }
        }
      }
    ]
  }
}


DELETE my_index
#结合路径
PUT my_index
{
  "mappings": {
    "dynamic_templates": [
      {
        "full_name": {
          "path_match":   "name.*",
          "path_unmatch": "*.middle",
          "mapping": {
            "type":       "text",
            "copy_to":    "full_name"
          }
        }
      }
    ]
  }
}


PUT my_index/_doc/1
{
  "name": {
    "first":  "John",
    "middle": "Winston",
    "last":   "Lennon"
  }
}

GET my_index/_search?q=full_name:John

三、总结

这一节的主要作用就是开发的时候方便点,其余的说实话,我感觉没到核心操作上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值