template概念
使用logstash导入数据到ES中由于索引按天拆分,手动创建mapping非常麻烦,ES内部维护了template,template定义好了mapping,如果索引的名称被template匹配到,那么该索引的mapping就按照template中定义的mapping自动创建。而且template中定义了索引的主分片和副分片的数量,分词等属性。
每个模板都有一个名字用于描述这个模板的用途,模板的级别使用order来管理,配合,一个 mapping 字段用于指明这个映射怎么使用,和至少一个参数(例如 match)来定义这个模板适用于哪个字段。
在elasticsearch中,如果你有一类相似的数据字段(我用logstash解析字段的时候,没有指定类型,所以解析出来的字段都是string类型,这些字段也不需要分词),想要统一设置其映射,就可以用到一项功能:动态模板映射(dynamic_templates)。
启动logstash系统会使用一个默认的动态映射模板,模板名字为logstash,使用_template查看。

在启动logstash过程中你会看到如下信息

你看第一行path=>nil表示没有找到自定义模板,那就使用默认模板,并且最后将模板存储在elasticsearch模板路径中,以logstash命名。模板内容:
参数:
match_mapping_type允许你只对特定类型的字段使用模板,正如标准动态映射规则那样,比如string,long等。
match(unmatch相反)参数只会匹配字段名,如"*_es",如果为"*",就是所有字段(同时是match_papping_type类型)都会匹配到
path_match(path_unmatch相反)参数用于匹配对象中字段的完整路径,比如address.*.name可以匹配如下字段:
{
"logstash": {
"order": 0,
"template": "logstash-*",
"settings": {
"index": {
"refresh_interval": "5s"
}
},
"mappings": {
"_default_": { # 文档类型
"dynamic_templates": # 关键词,固定的
[ # 必须是中括号
{
"message_field": #模板名
{
"mapping": {
"fielddata": {
"format": "disabled"
},
"index": "analyzed", #是否分词,该demo是2.4.0的es,和6.5.4有一点点不太一样
"omit_norms": true,
"type": "string" # 转换成的类型
},
"match_mapping_type": "string", #匹配类型
"match": "message" #匹配规则
}
}, {
"string_fields": {
"mapping": {
"fielddata": {
"format": "disabled"
},
"index": "analyzed",
"omit_norms": true,
"type": "string",
"fields": {

本文深入讲解Elasticsearch模板,包括静态模板与动态模板的应用场景、优缺点,以及如何通过logstash自定义模板,提前设置索引映射,实现MySQL数据同步至Elasticsearch。探讨字段类型、分词、索引策略等关键要素。

1万+

被折叠的 条评论
为什么被折叠?



