本章,我们将简单介绍索引模板和动态模板的内容。其实,在前面章节,我们已经粗略地用到了动态模板,但是没有明确提出这样的概念。
索引模板
索引模板,英文名为Index Template。它是一种机制,这种机制允许我们定义一种模板,这种模板当新索引创建时将被自动应用。模板包含settings
和mapping
,以及这个模板是否可被应用于新的索引。
索引模板有以下限制:
- 索引模板仅在一个索引新创建时才起作用,修改模板不会影响已创建的索引。
- 可以设定多个索引模板,这些索引模板的设置将被
merge
在一起。 - 可以通过对索引模板指定
order
的数值,来控制merge
的过程。
接下来,我们创建两个模板。
# 创建一个默认模板,模板名为 template_default
# 这个模板匹配所有的索引,它的order属性值为0。索引创建时将被设置一个分片,一个副本。
PUT _template/template_default
{
"index_patterns": ["*"],
"order" : 0,
"version": 1,
"settings": {
"number_of_shards": 1,
"number_of_replicas":1
}
}
# 创建一个模板,模板名为 template_test
# 这个模板匹配test开头的索引,它的order属性值为1。索引创建时将被设置一个分片,两个副本。
# 并且,date类型自动检测功能将关闭,数字自动检测功能将开启。
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
}
}
# 删除模板名为template_1的模板
DELETE /_template/template_1
# 获取模板名为template_1的模板
GET /_template/template_1
# 获取通配符模板
GET /_template/temp*
# 获取多个模板
GET /_template/template_1,template_2
# 获取所有模板
GET /_template
# 判断模板是否存在
HEAD _template/template_1
索引模板起作用的时机在于新索引创建的时候。其工作方式将按照下面的顺序执行,并且会逐级覆盖。例如:order数值高的将覆盖order数值低的。
- 应用Elasticsearch默认的
settings
和mappings
。 - 应用 order 数值低的索引模板中的设置。
- 应用 order 数值高的索引模板中的设置
- 应用索引创建时,用户指定的
settings
和mappings
。
动态模板
动态模板,英文名为Dynamic Templates,是根据Elasticsearch可识别的数据类型,结合字段名称,来动态设定字段类型的一种机制。
而Elasticsearch自带了动态字段映射,它的规则如下所示。
动态字段映射通过动态模板这种机制,我们可以达到类似下面的效果:
- 所有的字符串类型都设定成
keyword
,或者关闭keyword
字段。 -
is
开头的字段都设置成boolean类型。 -
long_
开头的字段都设置成long类型。
它的语法如下所示:
动态模板的语法这种语法包含以下内容:
- 动态模板是定义在某个具体索引的mappings中
- 动态模板需要指定一个名称,例如上图的
my_template_name
- 匹配规则是一个数组
- 为匹配到的字段设置
mapping
1. 例子1
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"
}
}
}
]
}
}
PUT my_index/_doc/1
{
"firstName":"Ruan",
"isVIP":"true"
}
GET my_index/_mapping
在这个例子中,我们设置了两个动态模板。
- 根据
strings_as_boolean
的动态模板定义,如果字段类型为字符串类型,且字段名以is
开头,其字段类型将映射成boolean类型。 - 根据
strings_as_keywords
的动态模板定义,如果字段类型为字符串类型,其字段类型将映射成keyword类型。
2. 例子2
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
在这个例子中,我们定义了一个动态模板,名字叫full_name
。它会匹配路径,路径以name
开头,且不以middle
结尾的字段,将被映射成一个text,且拷贝到full_name这个字段中。
总结
我们了解了索引模板和动态模板各自的作用,也举了一些实际的例子来加深我们的印象。但是,更全面的内容还需要看Elasticsearch的官网。
网友评论