Client Elasticsearch pour C++ : elasticlient et guide complet

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 C++ : guide complet d'elasticlient

\n\n

Elasticsearch est un puissant système de recherche distribué construit sur Apache Lucene. Pour interagir avec lui depuis C++, il existe plusieurs bibliothèques. Dans cet article, nous examinerons en détail elasticlient — un client léger, moderne et pratique qui utilise la bibliothèque libcurl pour les requêtes HTTP et nlohmann/json pour le travail avec JSON. Il est idéal pour intégrer des fonctions de recherche dans des applications natives, des composants serveur et des outils d'analyse de données.

\n\n

Fonctionnalités principales d'elasticlient

\n
    \n
  • Prise en charge de toutes les opérations principales d'Elasticsearch : indexation, mise à jour, suppression de documents.
  • \n
  • Exécution de requêtes de recherche en texte intégral, avec filtres et agrégations.
  • \n
  • Gestion des index : création, suppression, configuration des mappings.
  • \n
  • Traitement par lots (bulk) pour des performances élevées.
  • \n
  • Prise en charge de SSL/TLS et de l'authentification de base.
  • \n
  • Requêtes asynchrones via des mécanismes de callback.
  • \n
\n\n

Installation de la bibliothèque

\n

Pour compiler elasticlient, vous aurez besoin d'un compilateur prenant en charge C++17 et des dépendances installées : libcurl (développement) et nlohmann-json. Installation via le gestionnaire de paquets (Ubuntu/Debian) :

\n
sudo apt install libcurl4-openssl-dev nlohmann-json3-dev cmake g++
\n

Compilation à partir des sources :

\n
git clone https://github.com/elastic/elasticlient.git\ncd elasticlient\nmkdir build && cd build\ncmake .. -DCMAKE_BUILD_TYPE=Release\nmake -j4\nsudo make install
\n\n

Connexion et configuration de base

\n

Pour commencer, créez une instance du client en spécifiant l'URL de votre cluster Elasticsearch :

\n
#include <elasticlient/client.h>\n#include <iostream>\n\nint main() {\n    elasticlient::Client client({"http://localhost:9200"});\n    // Vérification de la connexion\n    auto ping = client.ping();\n    if (ping.status() == 200) {\n        std::cout << "Connexion établie !" << std::endl;\n    }\n    return 0;\n}
\n

Pour un cluster de plusieurs nœuds, transmettez une liste d'URL :

\n
elasticlient::Client client({\n    "http://node1:9200",\n    "http://node2:9200",\n    "http://node3:9200"\n});
\n\n

Travail avec les documents

\n

Indexation d'un nouveau document (création ou mise à jour) :

\n
#include <nlohmann/json.hpp>\nusing json = nlohmann::json;\n\njson doc = {\n    {"title", "Elasticsearch pour C++"},\n    {"content", "Guide détaillé d'utilisation du client elasticlient"},\n    {"tags", {"cpp", "elasticsearch", "recherche"}},\n    {"views", 0}\n};\n\nauto result = client.index("articles", "article", doc.dump(), "1");\nif (result.status() == 201) {\n    std::cout << "Document créé : " << result.body() << std::endl;\n}
\n

Récupération d'un document par ID :

\n
auto getResult = client.get("articles", "article", "1");\nif (getResult.status() == 200) {\n    json docJson = json::parse(getResult.body());\n    std::cout << "Titre : " << docJson["_source"]["title"] << std::endl;\n}
\n

Mise à jour d'un document existant (partielle) :

\n
json updateFields = {\n    {"doc", {{"views", 42}}}\n};\nauto updateResult = client.update("articles", "article", "1", updateFields.dump());
\n\n

Recherche et filtrage

\n

Exécution d'une recherche en texte intégral avec Query DSL :

\n
json searchQuery = {\n    {"query", {\n        {"bool", {\n            {"must", {\n                {{"match", {{"content", "guide"}}}}\n            }},\n            {"filter", {\n                {{"term", {{"tags", "cpp"}}}}\n            }}\n        }}\n    }},\n    {"size", 10}\n};\n\nauto searchResult = client.search("articles", searchQuery.dump());\nif (searchResult.status() == 200) {\n    json                    

Recommendations