Elasticsearch Index Template 和 Dynamic Template 电脑版发表于:2020/12/12 20:27 ![elasticsearch](https://img.tnblog.net/arcimg/hb/5f1adabe8df94fdb8331eb80e393c4a3.jpeg "elasticsearch") >#Elasticsearch Index Template和Dynamic Template [TOC] 什么是 Index Template ------------ tn>可以通过一定的规则去设定 Mappings 和 Settings,并自动匹配到新创建的索引之上(比如设置副本数,或通过键命名规则指定类型) (1) 模版仅在一个索引被新创建时,才会产生作用。修改模版不会影响已被创建的索引 (2) 你可以设定多个索引模版,这些设置会被 “merge” 在一起 (3) 你可以指定 “order” 的数值,控制 “merging” 的过程 Index Template 的工作方式 ------------ ```mermaid graph TD A(创建索引) --> B(应用 Elasticsearch 默认的 settings 和 mappings) --> C(应用 order 数值低的 Index Template 中的设定) --> D(应用 order 高的 Index Template 中的设定) ``` tn>应用创建索引时,用户所指定的 Settings 和 Mappings,并覆盖之前模版中的设定;注意数值高的会覆盖数值低的 Demo ------------ > 创建 2 个 Index Templates ```bash #创建一个文档 PUT ttemplate/_doc/1 { "someNumber":"1", "someDate":"2019/01/01" } #数字字符串被映射成text,日期字符串被映射成日期,并没有达到我们所预期的效果 GET ttemplate/_mapping #Create a default template 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 } } ``` | | | | ------------ | ------------ | | number_of_shards | 是指索引要做多少个分片,只能在创建索引时指定,后期无法修改。 | | number_of_replicas | 是指每个分片有多少个副本,后期可以动态修改 | | date_detection | 是否使用Date类型的去识别字段 | | numeric_detection | 是否使用数值类型去识别字段 | > 查看template信息 ```bash GET /_template/template_default GET /_template/temp* ``` ![](https://img.tnblog.net/arcimg/hb/62b6d55557604a8f9fa8b10e2fd73cc5.png) >我们再次来尝试一下 ```bash #写入新的数据,index以test开头 PUT testtemplate/_doc/1 { "someNumber":"1", "someDate":"2019/01/01" } GET testtemplate/_mapping get testtemplate/_settings ``` tn>如下图,我们可以发现以test开头对应了前面第二条模版规则,由于时间类型验证没有开启,所以系统将**someDate**字段识别成了text文本类型。由于我们开启了数值类型验证,将**someNumber**识别成数值类型 ![](https://img.tnblog.net/arcimg/hb/8de1316c555d49458a278057cf5ccc0a.png) tn>同样setting中**number_of_shards**设置成了1,**number_of_replicas**设置成了2 ![](https://img.tnblog.net/arcimg/hb/f3d0f72ecbe54f90ac635f9c08e96a47.png) >### 问题一 tn>既然有这种模版规则,那自定义的setting会不会覆盖模版呢?我们准备了几行简单的代码。。 ```bash PUT testmy { "settings":{ "number_of_replicas":5 } } put testmy/_doc/1 { "key":"value" } get testmy/_settings ``` tn>我们发现它先按照模版来设定,再按照我们自定义的来设定。所以自定义的把原先的给覆盖掉了。 ![](https://img.tnblog.net/arcimg/hb/6c7798ecbff24d2b96d66d5cfd6995bb.png) 什么是 Dynamic Template ------------ tn>根据 Elasticsearch 识别的数据类型,结合字段名称,来动态设定字段类型 (1) 所有的字符串类型都设定成 Keyword,或者关闭 keyword 字段 (2) is 开头的字段都设置成 boolean (3) long_ 开头的都设置成 long 类型 ```bash 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" } } } ] } } ``` >创建一个**Dynamic Template**,规则是以**is**为开头的字段的类型指定为**boolean**类型;把**string**类型转为**keyword**类型。接下来我们放一些数据看看。。。 ```bash PUT my_index/_doc/1 { "firstName":"Ruan", "isVIP":"true" } GET my_index/_mapping ``` ![](https://img.tnblog.net/arcimg/hb/7f83f257492d4af9a416e9e970d7862f.png) >我们还可以将键值通过模版进行匹配,下面就是**name**下第一个字段到**last**之间的字段复制到**full_name**字段中去。 ```bash #结合路径 PUT my_index { "mappings": { "dynamic_templates": [ { "full_name": { "path_match": "name.*", "path_unmatch": "*.last", "mapping": { "type": "text", "copy_to": "full_name" } } } ] } } ``` tn>然后我们通过full_name字段查询John或Winston都可以查询得到 ```bash PUT my_index/_doc/1 { "name": { "first": "John", "middle": "Winston", "last": "Lennon" } } GET my_index/_search?q=full_name:Winston ``` ![](https://img.tnblog.net/arcimg/hb/ffe8c2851c024b73ab6d37a356e34bb7.png)