【Elastic Engineering】Elasticsearch: Index template

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: Elasticsearch: Index template

作者:刘晓国


Index template 定义在创建新 index 时可以自动应用的 settingsmappingsElasticsearch 根据与 index 名称匹配的 index 模式将模板应用于新索引。这个对于我们想创建的一系列的 Index 具有同样的 settings 及 mappings。比如我们希望每一天/月的日志的index都具有同样的设置。

image.png



Index template 仅在 index 创建期间应用。 对 index template 的更改不会影响现有索引。 create index API 请求中指定的设置和映射会覆盖索引模板中指定的任何设置或映射。


你可以在代码中加入像 C 语言那样的 block 注释。你可以把这个注释放在出来开头 “{” 和结尾的 “}” 之间的任何地方。


定义一个Index template


我们可以使用如下的接口来定义一个 index template:

PUT /_template/<index-template>

我们可以使用_template这个终点来创建,删除,查看一个 index template。下面,我们来举一个例子:

PUT _template/logs_template
{
  "index_patterns": "logs-*",
  "order": 1, 
  "settings": {
    "number_of_shards": 4,
    "number_of_replicas": 1
  },
  "mappings": { 
    "properties": {
      "@timestamp": {
        "type": "date"
      }
    }
  }
}

在上面,我们可以看到,我们定义了一个叫做 logs_template 的 index template。它的 index_patterns 定义为 “logs-*”,说明,任何以 “logs-” 为开头的任何一个 index 将具有在该 template 里具有的 settings 及 mappings 属性。这里的 “order” 的意思是:如果索引与多个模板匹配,则 Elasticsearch 应用此模板的顺序。该值为1,表明有最先合并,如果有更高 order 的 template,这个 settings 或 mappings 有可能被其它的 template 所覆盖。


下面,我们来测试一下我们刚定义的index template:

PUT logs-2019-03-01

在这里,我们创建了一个叫做 logs-2019-03-01 的 index。我们使用如下的命令来检查被创建的情况:

GET logs-2019-03-01

显示的结果为:

{
  "logs-2019-03-01" : {
    "aliases" : { },
    "mappings" : {
      "properties" : {
        "@timestamp" : {
          "type" : "date"
        }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1567652671032",
        "number_of_shards" : "4",
        "number_of_replicas" : "1",
        "uuid" : "Dz5rqRS4SEyLM_gf5eEolQ",
        "version" : {
          "created" : "7030099"
        },
        "provided_name" : "logs-2019-03-01"
      }
    }
  }
}

证如上所示,我们已经成功创建了一个我们想要的 index,并且它具有我们之前定义的 settings 及 mappings。


Index template 和 alias


我们甚至可以为我们的 index template 添加 index alias:

PUT _template/logs_template
{
  "index_patterns": "logs-*",
  "order": 1, 
  "settings": {
    "number_of_shards": 4,
    "number_of_replicas": 1
  },
  "mappings": { 
    "properties": {
      "@timestamp": {
        "type": "date"
      }
    }
  },
  "aliases": {
    "{index}-alias" : {}
  }
}

在上面,我们已经创立了一个叫做 {index}-alias 的别名。这里的 {index} 就是实际生成 index 的文件名来代替。我们下面用一个例子来说明:

PUT logs-2019-04-01

我们创建一个叫做 logs-2019-04-01 的index, 那么它同时生成了一个叫做 logs-2019-04-01-alias 的别名。我们可以通过如下的命令来检查:

GET logs-2019-04-01-alias

显示的结果是:

{
  "logs-2019-04-01" : {
    "aliases" : {
      "logs-2019-04-01-alias" : { }
    },
    "mappings" : {
      "properties" : {
        "@timestamp" : {
          "type" : "date"
        }
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1567653644605",
        "number_of_shards" : "4",
        "number_of_replicas" : "1",
        "uuid" : "iLf-j_G2T4CYcHCqwz32Ng",
        "version" : {
          "created" : "7030099"
        },
        "provided_name" : "logs-2019-04-01"
      }
    }
  }
}


Index 匹配多个 template


多个索引模板可能与索引匹配,在这种情况下,设置和映射都合并到索引的最终配置中。 可以使用 order 参数控制合并的顺序,首先应用较低的顺序,并且覆盖它们的较高顺序。 例如:

PUT /_template/template_1
{
    "index_patterns" : ["*"],
    "order" : 0,
    "settings" : {
        "number_of_shards" : 1
    },
    "mappings" : {
        "_source" : { "enabled" : false }
    }
}
PUT /_template/template_2
{
    "index_patterns" : ["te*"],
    "order" : 1,
    "settings" : {
        "number_of_shards" : 1
    },
    "mappings" : {
        "_source" : { "enabled" : true }
    }
}

以上的 template_1 将禁用存储 _source,但对于以 te * 开头的索引,仍将启用 _source。 注意,对于映射,合并是 “深度” 的,这意味着可以在高阶模板上轻松添加/覆盖特定的基于对象/属性的映射,而较低阶模板提供基础。


我们可以来创建一个例子看看:

PUT test10
GET test10

显示的结果是:

{
  "test10" : {
    "aliases" : { },
    "mappings" : { },
    "settings" : {
      "index" : {
        "creation_date" : "1567654333181",
        "number_of_shards" : "1",
        "number_of_replicas" : "1",
        "uuid" : "iEwaQFl9RAKyTt79PduN-Q",
        "version" : {
          "created" : "7030099"
        },
        "provided_name" : "test10"
      }
    }
  }
}

如果我们创建另外一个不是以  “te” 开头的 index,我们可以看看如下的情况:

PUT my_test_index
GET my_test_index

显示的结果是:

{
  "my_test_index" : {
    "aliases" : { },
    "mappings" : {
      "_source" : {
        "enabled" : false
      }
    },
    "settings" : {
      "index" : {
        "creation_date" : "1567654713059",
        "number_of_shards" : "1",
        "number_of_replicas" : "1",
        "uuid" : "aSsIZMT2RyWKT44G2dF2zg",
        "version" : {
          "created" : "7030099"
        },
        "provided_name" : "my_test_index"
      }
    }
  }
}

显然在 mappings 里显示 source 是被禁止的。


如果对于两个 templates 来说,如果 order 是一样的话,我们可能陷于一种不可知论的合并状态。在实际的使用中必须避免。


查询 Index template 接口


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

GET /_template/<index-template>

比如:

GET _template/logs_template

显示的结果是:

{
  "logs_template" : {
    "order" : 1,
    "index_patterns" : [
      "logs-*"
    ],
    "settings" : {
      "index" : {
        "number_of_shards" : "4",
        "number_of_replicas" : "1"
      }
    },
    "mappings" : {
      "properties" : {
        "@timestamp" : {
          "type" : "date"
        }
      }
    },
    "aliases" : {
      "{index}-alias" : { }
    }
  }
}

显示的内容就是我们之前已经创建的那个 index template。


你也可以通过如下的方式来同时查询多个 template 的情况:

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


检查一个 index template 是否存在


我们可以使用如下的命令来检查一个 index template 是否存在:

HEAD _template/logs_template

如果存在就会返回:

200 - OK

否则就会返回:

{"statusCode":404,"error":"Not Found","message":"404 - Not Found"}


删除一个 index template


在之前的练习中,我们匹配 “*”,也就是我们以后所有的创建的新的 index 将不存储 source,这个显然不是我们所需要的。我们需要来把这个 template 进行删除。删除一个 template 的接口如下:

DELETE /_template/<index-template>

那么针对我们的情况,我们可以使用如下的命令来删除我们不需要的 template:

DELETE _template/template_1
DELETE _template/template_2

这样我们删除了我们刚才创建的两个 templates。


参考:


【1】https://www.elastic.co/guide/en/elasticsearch/reference/7.4/indices-get-template.html


【2】https://www.elastic.co/guide/en/elasticsearch/reference/7.4/indices-delete-template.html


【3】https://www.elastic.co/guide/en/elasticsearch/reference/7.4/indices-templates.html


相关实践学习
利用Elasticsearch实现地理位置查询
本实验将分别介绍如何使用Elasticsearch7.10版本进行全文检索、多语言检索和地理位置查询三个Elasticsearch基础检索子场景的实现。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
1月前
|
存储
Elasticsearch exception [type=cluster_block_exception, reason=blocked by: [FORBIDDEN/12/index r【已解决】
Elasticsearch exception [type=cluster_block_exception, reason=blocked by: [FORBIDDEN/12/index r【已解决】
37 1
|
2月前
|
运维 架构师 搜索推荐
7 年+积累、 Elastic 创始人Shay Banon 等 15 位专家推荐的 Elasticsearch 8.X新书已上线...
7 年+积累、 Elastic 创始人Shay Banon 等 15 位专家推荐的 Elasticsearch 8.X新书已上线...
39 4
|
2月前
|
存储 安全 数据处理
Elastic 中国开发者大会2023最新干货——Elasticsearch 7、8 新功能一网打尽
Elastic 中国开发者大会2023最新干货——Elasticsearch 7、8 新功能一网打尽
31 0
|
2月前
|
索引
Elasticsearch exception [type=illegal_argument_exception, reason=index [.1] is the write index for data stream [slowlog] and cannot be deleted]
在 Elasticsearch 中,你尝试删除的索引是一个数据流(data stream)的一部分,而且是数据流的写入索引(write index),因此无法直接删除它。为了解决这个问题,你可以按照以下步骤进行操作:
|
2月前
|
API 索引
Elasticsearch Index Shard Allocation 索引分片分配策略
Elasticsearch Index Shard Allocation 索引分片分配策略
98 1
|
7月前
|
搜索推荐 索引
Elasticsearch elastic io 100%,但磁盘的iops和吞吐量没爆没啥原因吗?
Elasticsearch elastic io 100%,但磁盘的iops和吞吐量没爆没啥原因吗?
108 3
|
7月前
|
存储 缓存 监控
Elasticsearch elastic io 100%,但磁盘的iops和吞吐量没爆没啥原因吗?
Elasticsearch elastic io 100%,但磁盘的iops和吞吐量没爆没啥原因吗?
102 2
|
9月前
|
存储 自然语言处理 监控
ElasticSearch第三讲:ES详解 - Elastic Stack生态和场景方案
ElasticSearch第三讲:ES详解 - Elastic Stack生态和场景方案
100 0
|
存储 缓存 自然语言处理
Elasticsearch倒排索引(二)深入Term Index
Elasticsearch倒排索引(二)深入Term Index
282 0
|
1月前
Elasticsearch安装配置文件
Elasticsearch安装配置文件
17 0

热门文章

最新文章

相关产品

  • 检索分析服务 Elasticsearch版