use opensearch::{
auth::Credentials,
cert::CertificateValidation,
cluster::{ClusterDeleteComponentTemplateParts, ClusterPutComponentTemplateParts},
http::transport::{SingleNodeConnectionPool, TransportBuilder},
indices::{
IndicesCreateParts, IndicesDeleteIndexTemplateParts, IndicesDeleteParts,
IndicesGetIndexTemplateParts, IndicesGetParts, IndicesPutIndexTemplateParts,
},
OpenSearch,
};
use serde_json::json;
use url::Url;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let url = Url::parse("https://localhost:9200")?;
let credentials = Credentials::Basic("admin".into(), "admin".into());
let transport = TransportBuilder::new(SingleNodeConnectionPool::new(url))
.cert_validation(CertificateValidation::None)
.auth(credentials)
.build()?;
let client = OpenSearch::new(transport);
client
.indices()
.put_index_template(IndicesPutIndexTemplateParts::Name("books"))
.body(json!({
"index_patterns": ["books-*"],
"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" }
}
}
}
}))
.send()
.await?;
client
.indices()
.create(IndicesCreateParts::Index("books-nonfiction"))
.send()
.await?;
client
.indices()
.get(IndicesGetParts::Index(&["books-nonfiction"]))
.send()
.await?;
client
.indices()
.put_index_template(IndicesPutIndexTemplateParts::Name("books"))
.body(json!({
"index_patterns": ["books-*"],
"priority": 0,
"template": {
"settings": {
"index": {
"number_of_shards": 3,
"number_of_replicas": 0
}
}
}
}))
.send()
.await?;
client
.indices()
.put_index_template(IndicesPutIndexTemplateParts::Name("books-fiction"))
.body(json!({
"index_patterns": ["books-fiction-*"],
"priority": 1,
"template": {
"settings": {
"index": {
"number_of_shards": 1,
"number_of_replicas": 1
}
}
}
}))
.send()
.await?;
client
.indices()
.create(IndicesCreateParts::Index("books-fiction-romance"))
.send()
.await?;
client
.indices()
.get(IndicesGetParts::Index(&["books-fiction-romance"]))
.send()
.await?;
client
.cluster()
.put_component_template(ClusterPutComponentTemplateParts::Name("books_mappings"))
.body(json!({
"template": {
"mappings": {
"properties": {
"title": { "type": "text" },
"author": { "type": "text" },
"published_on": { "type": "date" },
"pages": { "type": "integer" }
}
}
}
}))
.send()
.await?;
client
.indices()
.put_index_template(IndicesPutIndexTemplateParts::Name("books"))
.body(json!({
"index_patterns": ["books-*"],
"composed_of": ["books_mappings"],
"priority": 0,
"template": {
"settings": {
"index": {
"number_of_shards": 3,
"number_of_replicas": 0
}
}
}
}))
.send()
.await?;
client
.indices()
.put_index_template(IndicesPutIndexTemplateParts::Name("books-fiction"))
.body(json!({
"index_patterns": ["books-fiction-*"],
"composed_of": ["books_mappings"],
"priority": 1,
"template": {
"settings": {
"index": {
"number_of_shards": 1,
"number_of_replicas": 1
}
}
}
}))
.send()
.await?;
client
.indices()
.create(IndicesCreateParts::Index("books-fiction-horror"))
.send()
.await?;
client
.indices()
.get(IndicesGetParts::Index(&["books-fiction-horror"]))
.send()
.await?;
client
.indices()
.get_index_template(IndicesGetIndexTemplateParts::Name(&["books"]))
.send()
.await?;
client
.indices()
.delete_index_template(IndicesDeleteIndexTemplateParts::Name("books"))
.send()
.await?;
client
.indices()
.delete(IndicesDeleteParts::Index(&["books-*"]))
.send()
.await?;
client
.indices()
.delete_index_template(IndicesDeleteIndexTemplateParts::Name("books-fiction"))
.send()
.await?;
client
.cluster()
.delete_component_template(ClusterDeleteComponentTemplateParts::Name("books_mappings"))
.send()
.await?;
Ok(())
}