索引模板

在类似日志的场景下,索引模板是非常有效的。一般日志是需要每天都自动生成一个模板的,这样对数据的管理以及集群的性能容灾等都是一个非常有用的帮助。但是每天根据日期都生成一个索引有一个问题,那就是索引的配置,如果每天都是我们自己去手动创建当天的索引,会非常麻烦并且容易出错,所幸的是,ElasticSearch 已经考虑到了这一点并且提出了索引模板的概念,配置好模板之后,只需要每天根据模板去生成索引便好。

Index Templates

Index Templates 就是 ElasticSearch 帮你生成一个模板,你只需要配置好 mapping 与 settings ,ElasticSearch 就会按照一定的规则将这些设置赋予新的索引。

  • 模板只会在一个索引新建时才会起作用,修改模板不会影响已经创建的索引结构
  • 可以设置多个索引模板,最终生成索引时这些模板会自动 merge 合并
  • 可以通过 order 优先序列号 去控制 merge 的过程

使用方式

_template API 是 ElasticSearch 专门设置模板使用的。一个模板有几个重要元素:

  • index_patterns 匹配规则,表示那些索引名创建时会使用模板
  • order 影响merge 的顺序
  • version 版本号
  • mappings
  • settings
所有的索引创建设置一个模板
#Create a default template
PUT _template/template_default
{
  "index_patterns": ["*"],
  "order" : 0,
  "version": 1,
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas":1
  }
}

上边就是一个模板创建的过程,这个模板设置了一下分片的大小,默认是主分片与副分片各为1,并且设置了index_patterns 为 * 意思就是所有的索引创建都会使用这个模板。

test 开头的索引创建一个模板
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,
    	"properties" : {
        "someDate" : {
          "type" : "keyword"
        },
        "someNumber" : {
          "type" : "long"
        }
    	}
    }
}

上边这个模板设置了index_patterns 为 test* 意思就是为 test开头的索引创建都会使用这个模板,并且这个模板还设置了一个 mappings,这个mappings 的意思是 开启日期的自动转化。
我们写入一个新的索引并且查看一下这个索引的mapping

#写入新的数据,index以test开头
PUT testtemplate/_doc/1
{
	"someNumber":"1",
	"someDate":"2019/01/01"
}
结果:{
  "testtemplate" : {
    "mappings" : {
      "date_detection" : false,
      "numeric_detection" : true,
      "properties" : {
        "someDate" : {
          "type" : "keyword"
        },
        "someNumber" : {
          "type" : "long"
        }
      }
    }
  }
}

可以发现mappins的设置已经生效了。

查看模板设置
#查看template信息
GET /_template/template_default
#通配符* 可以查看所有的模板
GET /_template/temp*
删除模板设置
DELETE /_template/template_test

注意: 如果在创建索引时指定了mappings 或者是 settings,那么指定的这个配置优先级比模板的配置高,会覆盖模板的配置。

Dynamic Template

Dynamic Template 也是索引模板的一种,不过他可以根据ElasticSearch自动识别字段类型的这个特性,去设置一些特殊字段的名称为某些特定的类型。

  • 可以设置所有字符串类型的字段都为 keyword
  • is 开头的字符串都设置成为 boolean 类型
设置一个 Dynamic Template
  • Dynamic Template 是设置在模板的mappings 中的,因为他要对字段生效
  • 匹配规则是一个数组
  • 为匹配到的字段设置类型
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"
          }
        }
      }
    ]
  }
}