Cliente Elasticsearch para Rust: elasticsearch-rs
elasticsearch-rs é o cliente assíncrono oficial para interagir com o Elasticsearch a partir do ecossistema Rust. A biblioteca fornece um conjunto completo de ferramentas para trabalhar com o motor de busca: desde operações CRUD simples até agregações complexas e consultas bulk. É desenvolvida e mantida pela equipe Elastic, garantindo a atualidade da API e compatibilidade com as versões mais recentes do Elasticsearch.
Principais recursos
- Suporte completo à API do Elasticsearch — indexação, busca, agregações, gerenciamento de índices, mapeamento e configurações do cluster.
- Assincronicidade — construída sobre tokio e reqwest, permitindo processar milhares de consultas sem bloquear threads.
- Segurança de tipos — todas as consultas e respostas são estritamente tipadas, erros de validação são capturados em tempo de compilação.
- Suporte a operações bulk — carregamento e atualização em massa de documentos com tratamento automático de erros.
- SSL/TLS e autenticação — suporte integrado para HTTPS, Basic Auth, chaves de API e tokens.
- Serialização via serde — documentos são automaticamente convertidos de/para JSON usando a crate serde.
Instalação e configuração
Adicione a dependência no Cargo.toml:
[dependencies]elasticsearch = "8.14.0"serde = { version = "1.0", features = ["derive"] }serde_json = "1.0"tokio = { version = "1.0", features = ["full"] }Conexão básica com uma instância local do Elasticsearch:
use elasticsearch::{Elasticsearch, Error};use url::Url;
#[tokio::main]async fn main() -> Result<(), Error> { let client = Elasticsearch::new( elasticsearch::http::transport::Transport::single_node( Url::parse("http://localhost:9200")? )? ); // Verificação de conexão let response = client.ping().send().await?; println!("Elasticsearch disponível: {}", response.status_code()); Ok(())}Trabalhando com documentos
Indexação de documento
Vamos definir uma estrutura para serialização:
use serde::{Serialize, Deserialize};
#[derive(Debug, Serialize, Deserialize)]struct Book { title: String, author: String, year: u16, isbn: String,}Indexação de um novo documento:
use elasticsearch::{IndexParts, SearchParts};use serde_json::json;
async fn index_book(client: &Elasticsearch, book: &Book) -> Result<(), Error> { let response = client .index(IndexParts::IndexId("books", &book.isbn)) .body(book) .send() .await?; println!("Documento indexado: {:?}", response); Ok(())}Busca por índice
Exemplo de busca em texto completo:
async fn search_books(client: &Elasticsearch, query: &str) -> Result, Error> { let response = client .search(SearchParts::Index(&["books"])) .body(json!({ "query": { "multi_match": { "query": query, "fields": ["title^2", "author"] } } })) .send() .await?; let response_body = response.json::().await?; let hits = response_body["hits"]["hits"] .as_array() .unwrap_or(&vec![]); let books: Vec = hits .iter() .filter_map(|hit| { let source = hit["_source"].clone(); serde_json::from_value(source).ok() }) .collect(); Ok(books)} Operações bulk para carregamento em massa
Carregamento eficiente de milhares de documentos:
use elasticsear Também na biblioteca
Event Bus e padrão Observer em JavaScript (Node.js): implementação e exemplos
Actors em Swift: Guia Completo com Exemplos Práticos
Geolocalização e Mapas em C# (.NET): Visão Geral de Bibliotecas e Ferramentas
Geração de PDF em TypeScript: bibliotecas, ferramentas e exemplos de código