Cliente Elasticsearch para Rust: visão geral da biblioteca elasticsearch-rs

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Cliente Elasticsearch para Rust: elasticsearch-rs

\n\n

Elasticsearch é 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\n

O que é elasticsearch-rs?

\n

elasticsearch-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
    \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 serde e serde_json.
  • \n
  • Suporte a autenticação — Basic Auth, chaves de API, SSL/TLS.
  • \n
\n\n

Instalação

\n

Adicione a dependência no Cargo.toml:

\n
[dependencies]\nelasticsearch = "8.14.0"\nserde = { version = "1.0", features = ["derive"] }\nserde_json = "1.0"\ntokio = { version = "1", features = ["full"] }
\n\n

Conexão básica

\n

Vamos criar um cliente conectando-se a uma instância local do Elasticsearch:

\n
use 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\n

Operações principais: CRUD

\n\n

1. Indexação de documento

\n

Vamos adicionar um documento com informações de um livro no índice books:

\n
#[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\n

2. Obtenção de documento

\n
let 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\n

3. Atualização de documento

\n
let 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\n

4. Exclusão de documento

\n
let response = client\n    .delete(DeleteParts::IndexId("books", "1"))\n    .send()\n    .await?;\n\nprintln!("Excluído: {:?}", response.body());
\n\n

Busca com Query DSL

\n

Vamos realizar uma busca de texto completo no campo title:

\n
use elasticsearch::SearchParts;\n\nl                    

Recommendations