如何使用 Elasticsearch 中的 index template

容器与中间件中间件技术服务知识库
前言

index template 顾名思义为索引的模板,它指的是我们先预先定义索引的 setting 和 mapping,在新的 index 创建的过程中,会自动应用我们已经定义好的 mapping 和 setting,一方面,index template 简化了我们创建索引时的步骤,另一方面,一个标准化的模板,会使日后的索引管理更加方便。

如何使用 index template

1. 创建一个 index template

这个 index template 有如下特点:

  1. 我们定义了一个名为 logs_template的 index template。
  2. index_patterns =logs-* 说明 以"logs-" 开头的索引,将具备这个 template 所配置的mapping 和 setting。
  3. order 指的是索引应用模板的顺序,1 表明此模板优先级为最高。
PUT _template/logs_template
{
  "index_patterns": "logs-*",
  "order": 1,
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "host_name": {
        "type": "keyword"
      },
      "created_at": {
        "type": "date",
        "format": "EEE MMM dd HH:mm:ss Z yyyy"
      }
    }
  }
}

2. 创建 index 并查看 mapping 和 setting

PUT logs-2022-02-15

GET logs-2022-02-15/_mapping

返回值如下:
{
  "logs-2022-02-15" : {
    "mappings" : {
      "properties" : {
        "created_at" : {
          "type" : "date",
          "format" : "EEE MMM dd HH:mm:ss Z yyyy"
        },
        "host_name" : {
          "type" : "keyword"
        }
      }
    }
  }
}

GET logs-2022-02-15/_settings

返回值如下:
{
  "logs-2022-02-15" : {
    "settings" : {
      "index" : {
        "creation_date" : "1644894349069",
        "number_of_shards" : "1",
        "number_of_replicas" : "1",
        "uuid" : "b1aH4dWNStul_a8A3CeUfQ",
        "version" : {
          "created" : "7100299"
        },
        "provided_name" : "logs-2022-02-15"
      }
    }
  }
}

3. index 匹配多个 template

我们有如下两个 index template:

  1. template_0 将禁用存储 _source,对所有index 有效。同时设定了分片数为2,副本数为1
  2. 但对于以 logs* 开头的索引,仍将启用 _source。同时设定了分片数为1,副本数为1
  3. 两个 template 的 order 均为 0
PUT _template/logs_template_0
{
  "index_patterns": "*",
  "order": 0,
  "settings": {
    "number_of_shards": 2,
    "number_of_replicas": 1
  },
  "mappings": {
    "_source": {
      "enabled": false
    },
    "properties": {
      "name": {
        "type": "text"
      }
    }
  }
}


PUT _template/logs_template_1
{
  "index_patterns": "logs*",
  "order": 1,
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1
  },
  "mappings": {
    "_source": {
      "enabled": true
    },
    "properties": {
      "name": {
        "type": "text"
      }
    }
  }
}

创建 一个名为 logs-2022-02-15 的index,我们原本以为 index 会精确的匹配到logs_template_1,实际上却匹配到了logs_template_0,和我们的预期不符。 对于两个 templates 来说,如果 order 是一样的话,并且index_patterns 有重叠部分, ES 可能陷于一种不可知的合并状态。在实际的使用中必须避免。 如果我们将 logs_template_1 中的 order 设置为1,出现的结果是符合我们预期的。

PUT logs-2022-02-15


GET logs-2022-02-15

{
  "logs-2022-02-15" : {
    "aliases" : { },
    "mappings" : {
      "_source" : {
        "enabled" : false
      },
      "properties" : {
        "name" : {
          "type" : "text"
        }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1644902819841",
        "number_of_shards" : "2",
        "number_of_replicas" : "1",
        "uuid" : "DkMML4hnSXWMRo4Gtjf5Bg",
        "version" : {
          "created" : "7100299"
        },
        "provided_name" : "logs-2022-02-15"
      }
    }
  }
}

4. 查询 index template

我们可以通过如下的接口来查询已经被创建好的 index template:

GET /_template/<index name>

或者使用如下方式来查询多个 template

GET /_template/logs_template_1,logs_template_2

GET /_template/logs*

GET /_template

5. 删除一个 index template

DELETE /_template/<index-template>

6. index template 的一些特性

  • 模板只在一个索引被创建的时候才会产生作用,修改模板不会影响已创建的索引。
  • 用户所指定的 Settings 和 Mappings 会覆盖之前模板中的设定,也就是说,手动指定的 settings 和 mapping 优先级要高于模板。
参考文档

[1] https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-templates-v1.html 如果您有其他问题,欢迎您联系火山引擎技术支持服务

21
0
0
0
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论