2023-10-26 22:55:50 -04:00
#!/usr/bin/env python
# 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.
2023-10-11 10:11:35 -07:00
from opensearchpy import OpenSearch
2023-11-21 13:04:39 -05:00
def main () -> None :
# 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" },
}
},
2023-10-26 22:55:50 -04:00
},
},
2023-11-21 13:04:39 -05:00
)
2023-10-11 10:11:35 -07:00
2023-11-21 13:04:39 -05:00
# 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" ))
2023-10-11 10:11:35 -07:00
2023-11-21 13:04:39 -05:00
# 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 }}
},
2023-10-26 22:55:50 -04:00
},
2023-11-21 13:04:39 -05:00
)
2023-10-11 10:11:35 -07:00
2023-11-21 13:04:39 -05:00
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 }}
},
2023-10-26 22:55:50 -04:00
},
2023-11-21 13:04:39 -05:00
)
2023-10-11 10:11:35 -07:00
2023-11-21 13:04:39 -05:00
# # Test multiple index templates
client . indices . create ( index = "books-fiction-romance" )
print ( client . indices . get ( index = "books-fiction-romance" ))
2023-10-11 10:11:35 -07:00
2023-11-21 13:04:39 -05:00
# 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" },
}
2023-10-26 22:55:50 -04:00
}
}
},
2023-11-21 13:04:39 -05:00
)
2023-10-11 10:11:35 -07:00
2023-11-21 13:04:39 -05:00
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 }}
},
2023-10-26 22:55:50 -04:00
},
2023-11-21 13:04:39 -05:00
)
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" )
2023-10-11 10:11:35 -07:00
2023-11-21 13:04:39 -05:00
if __name__ == "__main__" :
main ()