#!/usr/bin/env python # -*- coding: utf-8 -*- # SPDX-License-Identifier: Apache-2.0 # # The OpenSearch Contributors require contributions made to # this file be licensed under the Apache-2.0 license or a # compatible open source license. # # Modifications Copyright OpenSearch Contributors. See # GitHub history for details. from opensearchpy import OpenSearch # Create a client instance client = OpenSearch( hosts=["https://localhost:9200"], use_ssl=True, verify_certs=False, http_auth=("admin", "admin"), ) # You can create an index template to define default settings and mappings for indices of certain patterns. The following example creates an index template named `books` with default settings and mappings for indices of the `books-*` pattern: client.indices.put_index_template( name="books", body={ "index_patterns": ["books-*"], "priority": 1, "template": { "settings": {"index": {"number_of_shards": 3, "number_of_replicas": 0}}, "mappings": { "properties": { "title": {"type": "text"}, "author": {"type": "text"}, "published_on": {"type": "date"}, "pages": {"type": "integer"}, } }, }, }, ) # Now, when you create an index that matches the `books-*` pattern, OpenSearch will automatically apply the template's settings and mappings to the index. Let's create an index named books-nonfiction and verify that its settings and mappings match those of the template: client.indices.create(index="books-nonfiction") print(client.indices.get(index="books-nonfiction")) # If multiple index templates match the index's name, OpenSearch will apply the template with the highest `priority`. The following example creates two index templates named `books-*` and `books-fiction-*` with different settings: client.indices.put_index_template( name="books", body={ "index_patterns": ["books-*"], "priority": 1, "template": { "settings": {"index": {"number_of_shards": 3, "number_of_replicas": 0}} }, }, ) client.indices.put_index_template( name="books-fiction", body={ "index_patterns": ["books-fiction-*"], "priority": 2, "template": { "settings": {"index": {"number_of_shards": 1, "number_of_replicas": 1}} }, }, ) # # Test multiple index templates client.indices.create(index="books-fiction-romance") print(client.indices.get(index="books-fiction-romance")) # Composable index templates are a new type of index template that allow you to define multiple component templates and compose them into a final template. The following example creates a component template named `books_mappings` with default mappings for indices of the `books-*` and `books-fiction-*` patterns: client.cluster.put_component_template( name="books_mappings", body={ "template": { "mappings": { "properties": { "title": {"type": "text"}, "author": {"type": "text"}, "published_on": {"type": "date"}, "pages": {"type": "integer"}, } } } }, ) client.indices.put_index_template( name="books", body={ "index_patterns": ["books-*"], "composed_of": ["books_mappings"], "priority": 4, "template": { "settings": {"index": {"number_of_shards": 3, "number_of_replicas": 0}} }, }, ) client.indices.put_index_template( name="books-fiction", body={ "index_patterns": ["books-fiction-*"], "composed_of": ["books_mappings"], "priority": 5, "template": { "settings": {"index": {"number_of_shards": 1, "number_of_replicas": 1}} }, }, ) # Test composable index templates client.indices.create(index="books-fiction-horror") print(client.indices.get(index="books-fiction-horror")) # Get an index template print(client.indices.get_index_template(name="books")) # Delete an index template client.indices.delete_index_template(name="books") # Cleanup client.indices.delete(index="books-*") client.indices.delete_index_template(name="books-fiction") client.cluster.delete_component_template(name="books_mappings")