Elasticsearch-Client für Rust: Offizielle Bibliothek elasticsearch-rs

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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                    

Empfehlungen