ElasticSearch的REST APIs 之 索引的模板管理

原创
2021/11/03 17:58
阅读数 281

基于ES 7.7 英文官方文档

主要内容:

  • 新增或修改索引模板(Put index templates)
  • 删除索引模板(Deltet index templates)
  • 获取索引模板信息(Get index templates)
  • 判断一个模板是否存在(Index templates exists)

1. 新增或修改索引模板(Put index template API)

官方文档

可以参考: https://www.jianshu.com/p/1f67e4436c37

PUT /_template/<index-template>

描述

索引模板, 就是可以在创建新索引时自动应用的settings和mappings。 Elasticsearch通过索引名的匹配(index name pattern)将模板应用于新索引。

索引模板仅在创建索引时起作用,索引模板的修改不会影响已存在的索引。 在创建索引时指定的settings和mappings选项将覆盖与之相匹配的索引模板中的设置。

索引模板中可以写备注

可以在索引模板的body内(花括号内部)任意地方使用c语言风格的块注释(/**/):

# 不能在body的最外面的两个大括号之外写注释, 其他地方随意.
PUT _template/template_1
{
  /* 我这里可以写注释 */
  "index_patterns": ["te*", "bar*"],
  /* 注释2 */
  "settings": {
    /* 注释3 */
    "number_of_shards": 1
  }
}

目前kibana 7.7的web console界面里写代码会提示错误"Bad string", 但是不影响代码执行

索引创建/管理等api的body内目前都不支持写备注

获取索引时, 不会显示之前添加的备注, 怎么办????

路径参数

<index_template>

索引模板名称, 必填.

请求参数

create

(可选, bool) 如果设置为true,则只能新增模板,不能替换/修改已有的模板。默认false,会自动判断是create还是update操作。

order

(可选, integer) 如果一个索引匹配到多个模板, 则这个顺序决定了模板的优先级。数值越大,优先级越高。优先级高的模板的设置会覆盖优先级低的模板里面的配置。es会先合并低优先级的模板设置,最后合并高优先级的模板设置。

master_timeout

(可选,时间单位)连接到主节点的等待超时时间。如果在超时时间已过之前没有响应, 则返回错误。 默认是值 30s。

Request body

index_patterns

(必填, 字符串数组) 通配符表达式的数组

aliases

(可选, 别名对象(alias object)) 索引的别名. 参考 添加或修改索引别名

mappings

(可选, mapping 对象) 索引字段的mapping。如果指定了mapping,则可以包含:

更多参考 mapping官方文档

settings

(可选, 索引设置对象) 索引的配置项, 参考索引设置

version

(可选, integer) 用于外部管理索引模板的版本号。es不会自动生成这个数字,需要手动指定。

几个栗子

1. 在索引模板中指定索引别名

PUT _template/template_1
{
  /* 用通配符匹配索引名称, 以后新增的以te开头的索引都会以此为模板 */
  "index_patterns": ["te*"],
  "settings":{
    "number_of_shards": 1
  },
  /* 几个别名 */
  "aliases":{
    /* 固定的别名1 */
    "alias1":{},
    /* 固定的别名2: 带条件和路由 */
    "alias2":{
      "filter":{
        "term":{"user": "kimchy"}
      },
      "routing": "kimchy"
    },
    /* 以{}定义的占位符, 应用模板时会替换为实际的索引名称 */
    "{index}-alias": {}
  }
}

上面的代码中有一个占位符{index}, 应用模板时会替换为索引名称。

执行代码, 然后我们再新增一个te开头的索引, 然后查看这个索引的定义:

# 新增索引, 以te开头, 可以匹配上面的索引模板
PUT /te_1

# 查看索引的定义
GET /te_1

查看这个新增的索引te_1的定义, 结果如下:

{
  "te_1" : {
    "aliases" : {
      "alias1" : { },
      "alias2" : {
        "filter" : {
          "term" : {
            "user" : "kimchy"
          }
        },
        "index_routing" : "kimchy",
        "search_routing" : "kimchy"
      },
      "te_1-alias" : { }
    },
    "mappings" : { },
    "settings" : {
      "index" : {
        "creation_date" : "1635861702500",
        "number_of_shards" : "1",
        "number_of_replicas" : "1",
        "uuid" : "qtAMSW4cSI2JZ1B4BkNyeQ",
        "version" : {
          "created" : "7070099"
        },
        "provided_name" : "te_1"
      }
    }
  }
}

2. 一个索引匹配多个索引模板

多个索引模板可能会同时匹配到一个索引名称上,这个时候就轮到参数order上场了!它决定了谁的配置的优先级更高。优先级高的模板的配置会覆盖优先级低的。从低的开始合并,生成最终的配置。

如果一个索引匹配的模板中有order设置一样的,那么会导致一个不确定的覆盖顺序。

# 先建立一个优先级最低的模板
PUT /_template/template_1
{
  /* 匹配所有索引, 可以看做是索引的自定义的默认设置*/
  "index_patterns": ["*"],
  /* 排序, 设置最小0 */
  "order": 0,
  "settings": {
    "number_of_shards": 1
  },
  "mappings": {
    "_source": {"enabled": false}
  }
}

# 再建立一个优先级高的模板
PUT /_template/template_2
{
  /* 匹配所有已te开头的索引 */
  "index_patterns": ["te*"],
  /* 排序, 设置为2, 比上面那个优先级高*/
  "order": 1,
  "settings": {
    "number_of_shards": 2 /* 差异点1 */
  },
  "mappings": {
    "_source": {"enabled": true}/* 差异点2 */
  }
}

上面两个模板的差异点已经在注释中标注了。

现在新建一个索引 te_1

PUT /te_1
GET /te_1

那么最终呈现的结果是:

{
  "te_1" : {
    "aliases" : { },
    "mappings" : { },/*很奇怪这里没有看到配置*/
    "settings" : {
      "index" : {
        "creation_date" : "1635863786534",
        "number_of_shards" : "2", /*这里的配置是优先级高的那个模板的*/
        "number_of_replicas" : "1",
        "uuid" : "zJzTWrYrSwmWRl_lhj2dKw",
        "version" : {
          "created" : "7070099"
        },
        "provided_name" : "te_1"
      }
    }
  }
}

诡异的是, mappings._source.enabled配置没有获取到, why? 官方文档中说"Note, for mappings, the merging is "deep", meaning that specific object/property based mappings can easily be added/overridden on higher order templates, with lower order templates providing the basis." 这说得也很正常啊!

3. 管理模板的版本

PUT /_template/template_1
{
    "index_patterns" : ["*"],
    "order" : 0,
    "settings" : {
        "number_of_shards" : 1
    },
    /* 指定版本, 这个版本号只是为了管理的方便, ES不会自动生成或自动增加它的值 */
    "version": 123
}

如果想获取模板的版本号, 可以使用模板查询接口, 且只显示版本号选项:

GET /_template/template_1?filter_path=*.version

如果想删除版本号,修改模板的时候移除这个参数即可。比如:

PUT /_template/template_1
{
    "index_patterns" : ["*"],
    "order" : 0,
    "settings" : {
        "number_of_shards" : 1
    }
    /* 这里移除了version 设置*/
}

ES7.15版本文档中提及的内容

ES 7.15文档 链接

es内置了一些索引模板, 要避免模板的命名与这些模板冲突, 比如:

  • logs--
  • metrics--
  • synthetics--

这些模板的order都是100。


2. 删除索引模板(Deltet index templates API)

删除一个或多个索引模板。 官方文档

DELETE /_template/<index-template>

路径参数

index-template

(必填, string) 索引模板名, 支持单个模板的字符串, 多个模板名的英文逗号分割、通配符表达式。

查询参数

master_timeout

(可选,时间单位)连接到主节点的等待超时时间。如果在超时时间已过之前没有响应, 则返回错误。 默认是值 30s。

timeout

(可选,时间单位)等待返回结果的超时时间。如果在超时时间已过之前没有响应, 则返回错误。 默认是值 30s

栗子:

DELETE /_template/template1
DELETE /_template/template1,template2
DELETE /_template/template*

3. 获取索引模板信息(Get index templates API)

获取一个或多个索引模板的信息。官方文档

GET /_template/<index-template>

路径参数

index-template

(必填, string) 索引模板名, 支持单个模板的字符串, 多个模板名的英文逗号分割、通配符表达式。

查询参数

flat_settings

(可选, bool) 如果设置为true,则以平面格式返回设置信息。默认false

local

(可选, bool) 如果设置为true, 则只从本地节点获取信息。默认false,表示从主节点获取信息。

master_timeout

(可选,时间单位)连接到主节点的等待超时时间。如果在超时时间已过之前没有响应, 则返回错误。 默认是值 30s。

几个栗子

1. 获取多个模板的信息

GET /_template/template_1,template_2

2. 通配符表达式获取所有匹配的模板的信息

GET /_template/template*

3. 获取所有的索引模板的信息

GET /_template

4. 获取索引模板的列表

# 获取所有的索引模板的列表
GET /_cat/templates

# 通配符表达式: 获取前缀为template的模板的列表
GET /_cat/templates/template*

4. 判断一个模板是否存在(Index templates exists API)

官方文档

HEAD /_template/<index-template>

路径参数

index-template

(必填, string) 索引模板名, 支持单个模板的字符串, 多个模板名的英文逗号分割、通配符表达式。

查询参数

flat_settings

(可选, bool) 如果设置为true,则以平面格式返回设置信息。默认false

ES7.15的文档中仍然有这个参数, 但是这个参数放在这里有什么用??

local

(可选, bool) 如果设置为true, 则只从本地节点获取信息。默认false,表示从主节点获取信息。

master_timeout

(可选,时间单位)连接到主节点的等待超时时间。如果在超时时间已过之前没有响应, 则返回错误。 默认是值 30s。

返回状态

  • 200 所有指定的索引模板都存在

  • 404 至少有一个指定的索引模板不存在

注意!! ES 7.7下实际测试结果与文档描述不相符!! ES 7.7下实际测试结果与文档描述不相符!! ES 7.7下实际测试结果与文档描述不相符!!

  • 只要有一个索引存在, 就会返回 200
  • 当所有索引不存在时才返回 404

last updated at 2021/11/3 17:58

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部