Elasticsearch-Client für Rust: elasticsearch-rs
elasticsearch-rs ist der offizielle asynchrone Client für die Interaktion mit Elasticsearch aus dem Rust-Ökosystem. Die Bibliothek bietet einen vollständigen Satz von Werkzeugen für die Arbeit mit der Suchmaschine: von einfachen CRUD-Operationen bis hin zu komplexen Aggregationen und Bulk-Anfragen. Sie wird vom Elastic-Team entwickelt und gewartet, was die Aktualität der API und die Kompatibilität mit den neuesten Elasticsearch-Versionen garantiert.
Hauptfunktionen
- Vollständige Unterstützung der Elasticsearch-API — Indizierung, Suche, Aggregationen, Indexverwaltung, Mapping und Cluster-Einstellungen.
- Asynchronität — basiert auf tokio und reqwest, ermöglicht die Verarbeitung Tausender Anfragen ohne Thread-Blockierung.
- Typsicherheit — alle Anfragen und Antworten sind streng typisiert, Validierungsfehler werden bereits zur Kompilierzeit abgefangen.
- Unterstützung für Bulk-Operationen — Massenladen und Aktualisieren von Dokumenten mit automatischer Fehlerbehandlung.
- SSL/TLS und Authentifizierung — integrierte Unterstützung für HTTPS, Basic Auth, API-Schlüssel und Token.
- Serialisierung über serde — Dokumente werden automatisch mit der Crate serde in/aus JSON konvertiert.
Installation und Konfiguration
Fügen Sie die Abhängigkeit in Cargo.toml hinzu:
[dependencies]elasticsearch = "8.14.0"serde = { version = "1.0", features = ["derive"] }serde_json = "1.0"tokio = { version = "1.0", features = ["full"] }Grundlegende Verbindung zu einer lokalen Elasticsearch-Instanz:
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")? )? ); // Verbindung prüfen let response = client.ping().send().await?; println!("Elasticsearch verfügbar: {}", response.status_code()); Ok(())}Arbeiten mit Dokumenten
Dokument indizieren
Definieren wir eine Struktur für die Serialisierung:
use serde::{Serialize, Deserialize};
#[derive(Debug, Serialize, Deserialize)]struct Book { title: String, author: String, year: u16, isbn: String,}Indizierung eines neuen Dokuments:
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!("Dokument indiziert: {:?}", response); Ok(())}Suche im Index
Beispiel für eine Volltextsuche:
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)} Bulk-Operationen für Massenladen
Effizientes Laden Tausender Dokumente:
use elasticsear Auch in der Bibliothek
Rate Limiting in Java: Bibliotheken und Tools zur Anfragenkontrolle (Bucket4j, Resilience4j)
Überwachung von .NET-Anwendungen mit Prometheus und OpenTelemetry
Arbeit mit S3 und Cloud-Speichern in TypeScript: Bibliotheken und Beispiele
TipKit für Swift: Vollständiges Tutorial mit Beispielen