Cliente Elasticsearch para Rust: elasticsearch-rs
\n\nElasticsearch é um poderoso sistema de busca e análise distribuído, construído sobre o Apache Lucene. Para interagir com ele a partir de aplicações em Rust, existe o cliente oficial — elasticsearch-rs. Esta biblioteca fornece um conjunto completo de ferramentas para trabalhar com a REST API do Elasticsearch, incluindo indexação, busca, agregações e gerenciamento de cluster. Neste artigo, abordaremos detalhadamente a instalação, configuração e principais funcionalidades do elasticsearch-rs com exemplos de código.
\n\nO que é elasticsearch-rs?
\nelasticsearch-rs é o cliente assíncrono oficial do Elasticsearch para a linguagem Rust, desenvolvido pela empresa Elastic. Ele é baseado na popular biblioteca de cliente HTTP assíncrono reqwest e fornece uma API type-safe para todos os endpoints do Elasticsearch. Principais vantagens:
- \n
- Suporte completo ao Elasticsearch 7.x e 8.x — todas as operações principais: CRUD, busca, agregações, gerenciamento de índices. \n
- Assíncrono — utiliza async/await, permitindo processar eficientemente múltiplas requisições. \n
- Type-safe — as estruturas de requisição e resposta são fortemente tipadas, reduzindo erros em tempo de execução. \n
- Serialização/desserialização automática — através de
serdeeserde_json. \n - Suporte a autenticação — Basic Auth, chaves de API, SSL/TLS. \n
Instalação
\nAdicione a dependência no Cargo.toml:
[dependencies]\nelasticsearch = "8.14.0"\nserde = { version = "1.0", features = ["derive"] }\nserde_json = "1.0"\ntokio = { version = "1", features = ["full"] }\n\nConexão básica
\nVamos criar um cliente conectando-se a uma instância local do Elasticsearch:
\nuse elasticsearch::Elasticsearch;\nuse elasticsearch::http::transport::Transport;\nuse serde_json::json;\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn std::error::Error>> {\n let transport = Transport::single_node("http://localhost:9200")?;\n let client = Elasticsearch::new(transport);\n // Verificação de conexão\n let response = client.ping().send().await?;\n println!("Elasticsearch disponível: {}", response.status_code());\n Ok(())\n}\n\nOperações principais: CRUD
\n\n1. Indexação de documento
\nVamos adicionar um documento com informações de um livro no índice books:
#[derive(Serialize, Deserialize, Debug)]\nstruct Book {\n title: String,\n author: String,\n year: u16,\n isbn: String,\n}\n\nlet book = Book {\n title: "Rust em Ação".into(),\n author: "Tim McNamara".into(),\n year: 2023,\n isbn: "978-5-4461-2345-6".into(),\n};\n\nlet response = client\n .index(IndexParts::IndexId("books", "1"))\n .body(json!(book))\n .send()\n .await?;\n\nprintln!("Documento indexado: {:?}", response.body());\n\n2. Obtenção de documento
\nlet response = client\n .get(GetParts::IndexId("books", "1"))\n .send()\n .await?;\n\nif response.status_code().is_success() {\n let book: Book = response.json().await?;\n println!("Documento encontrado: {:?}", book);\n}\n\n3. Atualização de documento
\nlet response = client\n .update(UpdateParts::IndexId("books", "1"))\n .body(json!({\n "doc": { "year": 2024 }\n }))\n .send()\n .await?;\n\nprintln!("Atualizado: {:?}", response.body());\n\n4. Exclusão de documento
\nlet response = client\n .delete(DeleteParts::IndexId("books", "1"))\n .send()\n .await?;\n\nprintln!("Excluído: {:?}", response.body());\n\nBusca com Query DSL
\nVamos realizar uma busca de texto completo no campo title:
use elasticsearch::SearchParts;\n\nl Também na biblioteca
Gerador de QR Code em Go (Golang) com a biblioteca go-qrcode
Internacionalização (i18n) em Go (Golang): Guia Completo
Métricas Prometheus em Rust: bibliotecas prometheus e metrics-exporter-prometheus
Rate Limiting em Go: guia para limitar a velocidade de requisições