Client Elasticsearch pour Rust : présentation de la bibliothèque elasticsearch-rs

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Client Elasticsearch pour Rust : elasticsearch-rs

\n\n

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

Qu'est-ce qu'elasticsearch-rs ?

\n

elasticsearch-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
    \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 serde et serde_json.
  • \n
  • Prise en charge de l'authentification — Basic Auth, clés API, SSL/TLS.
  • \n
\n\n

Installation

\n

Ajoutez la dépendance dans 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

Connexion de base

\n

Créons un client se connectant à une instance locale d'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    // Vérification de la connexion\n    let response = client.ping().send().await?;\n    println!("Elasticsearch disponible : {}", response.status_code());\n    Ok(())\n}
\n\n

Opérations principales : CRUD

\n\n

1. Indexation d'un document

\n

Ajoutons un document avec des informations sur un livre dans l'index 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 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\n

2. Récupération d'un document

\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!("Document trouvé : {:?}", book);\n}
\n\n

3. Mise à jour d'un document

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

4. Suppression d'un document

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

Recherche avec Query DSL

\n

Effectuons une recherche en texte intégral sur le champ title :

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

Recommendations