1-Elasticsearch - Index Templates

前言

索引模板允许我们定义在创建新索引时自动应用的模板。模板包括设置和映射,以及一个简单的模式模板,该模板控制是否应该将模板应用于新索引。

为什么需要索引模板?

在开发中,elasticsearch很大一部分工作是用来处理日志信息的,比如某公司对于日志处理策略是以日期为名创建每天的日志索引。并且每天的索引映射类型和配置信息都是一样的,只是索引名称改变了。如果手动的创建每天的索引,将会是一件很麻烦的事情。为了解决类似问题,elasticsearch提供了预先定义的模板进行索引创建,这个模板称作为Index Templates。通过索引模板可以让类似的索引重用同一个模板。

模板只在创建索引时应用。更改模板不会对现有索引产生影响。当使用create index API时,作为create index调用的一部分定义的设置/映射将优先于模板中定义的任何匹配设置/映射。
环境:

  • win10
  • elasticsearch6.5.4
  • kibana6.5.4

本文所有的示例演示都在kibanaDev Tools中完成。

创建索引模板

我们针对前文中提出的问题,来实现一个索引模板:

PUT _template/2019
{
  "index_patterns": ["20*", "product1*"],   ①
  "settings":{   ②
    "number_of_shards": 2,
    "number_of_replicas": 1
  },
  "mappings":{  ③
    "doc":{
      "properties":{
        "ip":{
          "type":"keyword"
        },
        "method":{
          "type": "keyword"
        }
      }
    }
  }
}

①,index_patterns是索引模式,指当创建以20product1开头的索引时,使用该索引模板。注意,在elasticsearch的6.x版本中,索引模板模式index_patterns取代原来的template
②,在settings设置中,我们自定义为该索引分配3个主分片。复制分片不变。
③,mappings中指定映射关系。

查看索引模板

我们来查看一下刚才创建的索引模板。

GET _template/2019

我们还可以通过使用通配符来查询多个模板。

GET /_template/temp*
GET /_template/template_1,template_2

除此之外,我们可以查看所有可用的模板列表:

GET /_template

也可以查询某个模板是否存在:

HEAD _template/2019

注意,返回是以HTTP的状态表示模板是否存在,200表示存在,404表示不存在。

索引模板的使用

有了索引模板,我们就可以创建索引并且添加数据了。

PUT 20190101/doc/1
{
  "ip": "127.0.0.1",
  "method":"GET"
}

PUT 20190102/doc/2
{
  "ip":"192.168.1.1",
  "method":"POST"
}

PUT product1_log/doc/1
{
  "ip":"127.0.0.1",
  "method":"GET"
}

上例会按照模板自动生成3个索引2019010120190102product1_log
当然查询也是没有问题的:

GET 2019*/doc/_search
{
  "query": {
    "match_all": {}
  }
}

我们可以通过查询索引的信息来看一下是否应用上了模板。

GET 20190101
# 结果如下
{
  "20190101" : {
    "aliases" : { },
    "mappings" : {
      "doc" : {
        "properties" : {
          "ip" : {
            "type" : "keyword"
          },
          "method" : {
            "type" : "keyword"
          }
        }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1557889480975",
        "number_of_shards" : "2",
        "number_of_replicas" : "1",
        "uuid" : "FEuyT5aoTnGP3k_7hCtQFA",
        "version" : {
          "created" : "6050499"
        },
        "provided_name" : "20190101"
      }
    }
  }
}

由上例可以看出,索引20190101已经成功应用上了我们之前创建的模板。

多模板匹配

多个索引模板可以应用于同一个索引,顺序由order参数的大小决定。比如现在有着一样的一个索引模板:

PUT _template/2018_1
{
  "index_patterns": ["2018*"],
  "order":0,
  "settings":{
    "number_of_shards": 2
  }
}

上述索引模板将应用于以2018开头的所有索引,设置索引的主分片数量为2,order参数为0。

PUT 2018010101/doc/1
{
  "method":"GET"
}
GET 2018010101/_settings
# 结果如下
{
  "2018010101" : {
    "settings" : {
      "index" : {
        "creation_date" : "1557900456281",
        "number_of_shards" : "2",
        "number_of_replicas" : "1",
        "uuid" : "P53RDmT6RRCDY2DlHtpymg",
        "version" : {
          "created" : "6050499"
        },
        "provided_name" : "2018010101"
      }
    }
  }
}

可以看到20180101索引的主分片数量是2,已经成功应用了索引模板。
现在我们再来创建一个索引模板:

PUT _template/2018_2
{
  "index_patterns": ["201802*"],
  "order":1,
  "settings":{
    "number_of_shards": 3
  }
}

上述模板应用于以201802开头的索引,只是主分片的数量为3,order参数为1。
我们再来创建一个索引:

PUT 2018010201/doc/1
{
  "method": "POST"
}
GET 20180201/_settings
# 结果如下
{
  "20180201" : {
    "settings" : {
      "index" : {
        "creation_date" : "1557901225020",
        "number_of_shards" : "3",
        "number_of_replicas" : "1",
        "uuid" : "-B8_ZiK7QgesmGSzD_8xlQ",
        "version" : {
          "created" : "6050499"
        },
        "provided_name" : "20180201"
      }
    }
  }
}

可以看到20180201索引应用了order参数为1的索引模板。这在某些情况下非常有效,比如我们预料到2018年2月份的日志将会暴增,而其他月份不变,所以我们通过上述创建多个模板来完成索引创建,2月份每天的索引的主分片都多一片,过了2月,恢复正常。

删除索引模板

删除索引模板使用DELETE命令删除即可:

DELETE _template/2019

需要注意的是,删除索引模板并不会影响其通过该模板创建的索引。那么,如果想要删除相关的索引怎么办?比如我们删除以2019开头的索引该怎么办?

DELETE 2019*

可以使用通配符*来完成。


see also:[Elasticsearch 6 新特性与重要变更解读](https://blog.csdn.net/napoay/article/details/79135136) | [官网:Index Templates](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-templates.html)
posted @ 2019-05-15 14:28  听雨危楼  阅读(3912)  评论(0编辑  收藏  举报