Cliente Elasticsearch para Rust: elasticsearch-rs
elasticsearch-rs es el cliente asíncrono oficial para interactuar con Elasticsearch desde el ecosistema Rust. La biblioteca proporciona un conjunto completo de herramientas para trabajar con el motor de búsqueda: desde operaciones CRUD simples hasta agregaciones complejas y consultas bulk. Es desarrollada y mantenida por el equipo de Elastic, lo que garantiza la actualidad de la API y la compatibilidad con las últimas versiones de Elasticsearch.
Características clave
- Soporte completo de la API de Elasticsearch — indexación, búsqueda, agregaciones, gestión de índices, mapeo y configuración del clúster.
- Asincronía — construida sobre tokio y reqwest, lo que permite procesar miles de solicitudes sin bloquear hilos.
- Seguridad de tipos — todas las solicitudes y respuestas están estrictamente tipadas, los errores de validación se detectan en tiempo de compilación.
- Soporte para operaciones bulk — carga y actualización masiva de documentos con manejo automático de errores.
- SSL/TLS y autenticación — soporte integrado para HTTPS, Basic Auth, claves API y tokens.
- Serialización mediante serde — los documentos se convierten automáticamente a/desde JSON usando la crate serde.
Instalación y configuración
Agregue la dependencia en Cargo.toml:
[dependencies]elasticsearch = "8.14.0"serde = { version = "1.0", features = ["derive"] }serde_json = "1.0"tokio = { version = "1.0", features = ["full"] }Conexión básica a una instancia local de 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")? )? ); // Verificación de conexión let response = client.ping().send().await?; println!("Elasticsearch disponible: {}", response.status_code()); Ok(())}Trabajo con documentos
Indexación de documentos
Definamos una estructura para la serialización:
use serde::{Serialize, Deserialize};
#[derive(Debug, Serialize, Deserialize)]struct Book { title: String, author: String, year: u16, isbn: String,}Indexación de un nuevo 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(())}Búsqueda en el índice
Ejemplo de búsqueda de 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)} Operaciones bulk para carga masiva
Carga eficiente de miles de documentos:
use elasticsear También en la biblioteca
GuzzleHTTP/Promises PHP: guía completa con ejemplos prácticos
Qt para C++: guía completa con ejemplos
Generación de códigos QR en PHP: biblioteca phpqrcode y guía completa
Planificador de tareas en C++: creamos un Task Scheduler desde cero
Análisis de HTML en C++: Reseña de las bibliotecas Gumbo, MyHTML y htmlcxx