Client Elasticsearch pour Rust : elasticsearch-rs
\n\nElasticsearch est un puissant système de recherche et d'analyse distribué, construit sur Apache Lucene. Pour interagir avec lui depuis des applications Rust, il existe un client officiel — elasticsearch-rs. Cette bibliothèque fournit un ensemble complet d'outils pour travailler avec l'API REST d'Elasticsearch, incluant l'indexation, la recherche, les agrégations et la gestion du cluster. Dans cet article, nous allons détailler l'installation, la configuration et les principales fonctionnalités d'elasticsearch-rs avec des exemples de code.
\n\nQu'est-ce qu'elasticsearch-rs ?
\nelasticsearch-rs est le client asynchrone officiel d'Elasticsearch pour le langage Rust, développé par la société Elastic. Il est basé sur la bibliothèque populaire de client HTTP asynchrone reqwest et fournit une API typée pour tous les endpoints Elasticsearch. Principaux avantages :
- \n
- Prise en charge complète d'Elasticsearch 7.x et 8.x — toutes les opérations principales : CRUD, recherche, agrégations, gestion des index. \n
- Asynchrone — utilise async/await, permettant de traiter efficacement de nombreuses requêtes. \n
- Sécurité de type — les structures de requêtes et de réponses sont strictement typées, réduisant le nombre d'erreurs d'exécution. \n
- Sérialisation/désérialisation automatique — via
serdeetserde_json. \n - Prise en charge de l'authentification — Basic Auth, clés API, SSL/TLS. \n
Installation
\nAjoutez la dépendance dans Cargo.toml :
[dependencies]\nelasticsearch = "8.14.0"\nserde = { version = "1.0", features = ["derive"] }\nserde_json = "1.0"\ntokio = { version = "1", features = ["full"] }\n\nConnexion de base
\nCréons un client se connectant à une instance locale d'Elasticsearch :
\nuse 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 // Vérification de la connexion\n let response = client.ping().send().await?;\n println!("Elasticsearch disponible : {}", response.status_code());\n Ok(())\n}\n\nOpérations principales : CRUD
\n\n1. Indexation d'un document
\nAjoutons un document avec des informations sur un livre dans l'index books :
#[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 en action".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!("Document indexé : {:?}", response.body());\n\n2. Récupération d'un document
\nlet 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!("Document trouvé : {:?}", book);\n}\n\n3. Mise à jour d'un document
\nlet response = client\n .update(UpdateParts::IndexId("books", "1"))\n .body(json!({\n "doc": { "year": 2024 }\n }))\n .send()\n .await?;\n\nprintln!("Mis à jour : {:?}", response.body());\n\n4. Suppression d'un document
\nlet response = client\n .delete(DeleteParts::IndexId("books", "1"))\n .send()\n .await?;\n\nprintln!("Supprimé : {:?}", response.body());\n\nRecherche avec Query DSL
\nEffectuons une recherche en texte intégral sur le champ title :
use elasticsearch::SearchParts;\n\nl Aussi dans la bibliothèque
Bibliothèques WebSocket TypeScript : ws et Socket.IO – guide complet
Travailler avec les dates en Swift : Foundation et DateFormatter