Briefly, this error occurs when Elasticsearch is unable to load a template during the metadata upgrade process. This could be due to issues like incorrect template syntax, missing template file, or insufficient permissions. To resolve this, you can check the syntax of your template, ensure the template file is in the correct location and accessible, and verify that Elasticsearch has the necessary permissions to read the template file. Additionally, check the Elasticsearch logs for more detailed error messages that can help pinpoint the exact issue.
In addition we recommend you run the Elasticsearch Template Optimizer to fix problems in your data modeling.
It will analyze your templates to detect issues and improve search performance, reduce indexing bottlenecks and optimize storage utilization. The Template Optimizer is free and requires no installation.
If you want to learn more about Elasticsearch templates, check out this guide.
Overview
A template in Elasticsearch falls into one of the two following categories and is indexed inside Elasticsearch using its dedicated endpoint:
- Index templates, which are a way to define a set of rules including index settings, mappings and an index pattern. The template is applied automatically whenever a new index is created with the matching pattern. Templates are also used to dynamically apply custom mapping for the fields which are not predefined inside existing mapping.
- Search templates, which help in defining templates for search queries using mustache scripting language. These templates act as a placeholder for variables defined inside the search queries.
Examples
Create a dynamic index template
PUT /_template/template_1?pretty { "index_patterns": [ "logs*", "api*" ], "settings": { "number_of_shards": 2 }, "mappings": { "dynamic_templates": [ { "strings": { "match_mapping_type": "string", "mapping": { "type": "keyword" } } } ], "properties": { "host_name": { "type": "keyword" }, "created_at": { "type": "date" } } } }
Create a search template
POST /_scripts/search_template_1?pretty { "script": { "lang": "mustache", "source": { "query": { "match": { "description": "{{query_string}}" } } } } }
Executing a search query using search template
GET /_search/template?pretty { "id": "search_template_1", "params": { "query_string": "hello world" } }
The search request will be executed by default on all the indices available in the cluster and can be limited to particular indices using an index parameter.
Notes
- A dynamic index template is always useful when you do not know the field names in advance and want to control their mapping as per the business use case.
Overview
Metadata in Elasticsearch refers to additional information stored for each document. This is achieved using the specific metadata fields available in Elasticsearch. The default behavior of some of these metadata fields can be customized during mapping creation.
Examples
Using _meta meta-field for storing application-specific information with the mapping:
PUT /my_index?pretty { "mappings": { "_meta": { "domain": "security", "release_information": { "date": "18-01-2020", "version": "7.5" } } } }
Notes
- In version 2.x, Elasticsearch had a total 13 meta fields available, which are: _index, _uid, _type, _id, _source, _size, _all, _field_names, _timestamp, _ttl, _parent, _routing, _meta
- In version 5.x, _timestamp and _ttl meta fields were removed.
- In version 6.x, the _parent meta field was removed.
- In version 7.x, _uid and _all meta fields were removed.
Log Context
Log “Error loading template [{}] as part of metadata upgrading” classname is TemplateUtils.java.
We extracted the following from Elasticsearch source code for those seeking an in-depth context :
XContentParser parser = XContentFactory.xContent(XContentType.JSON).createParser(XContentParserConfiguration.EMPTY; template) ) { map.put(templateName; IndexTemplateMetadata.Builder.fromXContent(parser; templateName)); } catch (IOException e) { // TODO: should we handle this with a thrown exception? logger.error("Error loading template [{}] as part of metadata upgrading"; templateName); } } /** * Loads a built-in template and returns its source.