[[index-templates]]
= Index templates

NOTE: This topic describes the composable index templates introduced in {es} 7.8.
For information about how index templates worked previously,
see the <<indices-templates-v1,legacy template documentation>>.

[[getting]]
An index template is a way to tell {es} how to configure an index when it is
created. For data streams, the index template configures the stream's backing
indices as they are created. Templates are configured
*prior to index creation*. When an index is created - either manually or
through indexing a document - the template settings are used as a basis for
creating the index.

There are two types of templates: index templates and <<indices-component-template,component templates>>. Component templates are reusable building
blocks that configure mappings, settings, and aliases. While you can use
component templates to construct index templates, they aren't directly applied
to a set of indices. Index templates can contain a collection of component
templates, as well as directly specify settings, mappings, and aliases.

The following conditions apply to index templates:

* Composable templates take precedence over legacy templates. If no composable
template matches a given index, a legacy template may still match and be
applied.
* If an index is created with explicit settings and also matches an index
template, the settings from the <<indices-create-index,create index>> request
take precedence over settings specified in the index template and its component
templates.
* If a new data stream or index matches more than one index template, the index
template with the highest priority is used.

[[avoid-index-pattern-collisions]]
.Avoid index pattern collisions
****
{es} has built-in index templates, each with a priority of `100`, for the
following index patterns:

// tag::built-in-index-template-patterns[]
- `logs-*-*`
- `metrics-*-*`
- `synthetics-*-*`
// end::built-in-index-template-patterns[]

{fleet-guide}/fleet-overview.html[{agent}] uses these templates to create
data streams. Index templates created by {fleet} integrations use similar
overlapping index patterns and have a priority up to `200`.

If you use {fleet} or {agent}, assign your index templates a priority lower than
`100` to avoid overriding these templates. Otherwise, to avoid accidentally
applying the templates, do one or more of the following:

- To disable all built-in index and component templates, set
<<stack-templates-enabled,`stack.templates.enabled`>> to `false` using the
<<cluster-update-settings,cluster update settings API>>.

- Use a non-overlapping index pattern.

- Assign templates with an overlapping pattern a `priority` higher than `200`.
For example, if you don't use {fleet} or {agent} and want to create a template
for the `logs-*` index pattern, assign your template a priority of `500`. This
ensures your template is applied instead of the built-in template for
`logs-*-*`.
****

[discrete]
[[create-index-templates]]
== Create index template

Use the <<indices-put-template,index template>> and <<indices-component-template,put component template>> APIs to create and update index templates.
You can also <<index-mgmt,manage index templates>> from Stack
Management in {kib}.

The following requests create two component templates.

[source,console]
----
PUT _component_template/component_template1
{
  "template": {
    "mappings": {
      "properties": {
        "@timestamp": {
          "type": "date"
        }
      }
    }
  }
}

PUT _component_template/runtime_component_template
{
  "template": {
    "mappings": {
      "runtime": { <1>
        "day_of_week": {
          "type": "keyword",
          "script": {
            "source": "emit(doc['@timestamp'].value.dayOfWeekEnum.getDisplayName(TextStyle.FULL, Locale.ROOT))"
          }
        }
      }
    }
  }
}
----
<1> This component template adds a <<runtime-mapping-fields,runtime field>>
named `day_of_week` to the mappings when a new index matches the template.

The following request creates an index template that is _composed of_ these
component templates.

[source,console]
----
PUT _index_template/template_1
{
  "index_patterns": ["te*", "bar*"],
  "template": {
    "settings": {
      "number_of_shards": 1
    },
    "mappings": {
      "_source": {
        "enabled": true
      },
      "properties": {
        "host_name": {
          "type": "keyword"
        },
        "created_at": {
          "type": "date",
          "format": "EEE MMM dd HH:mm:ss Z yyyy"
        }
      }
    },
    "aliases": {
      "mydata": { }
    }
  },
  "priority": 500,
  "composed_of": ["component_template1", "runtime_component_template"], <1>
  "version": 3,
  "_meta": {
    "description": "my custom"
  }
}
----
// TEST[continued]

////

[source,console]
----
DELETE _index_template/template_1
DELETE _component_template/runtime_component_template
DELETE _component_template/component_template1
----
// TEST[continued]

////

include::simulate-multi-component-templates.asciidoc[]
