Client Elasticsearch pour C++ : guide complet d'elasticlient
\n\nElasticsearch 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.
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
Installation de la bibliothèque
\nPour 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) :
sudo apt install libcurl4-openssl-dev nlohmann-json3-dev cmake g++\nCompilation à partir des sources :
\ngit clone https://github.com/elastic/elasticlient.git\ncd elasticlient\nmkdir build && cd build\ncmake .. -DCMAKE_BUILD_TYPE=Release\nmake -j4\nsudo make install\n\nConnexion et configuration de base
\nPour 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}\nPour un cluster de plusieurs nœuds, transmettez une liste d'URL :
\nelasticlient::Client client({\n "http://node1:9200",\n "http://node2:9200",\n "http://node3:9200"\n});\n\nTravail avec les documents
\nIndexation 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}\nRécupération d'un document par ID :
\nauto 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}\nMise à jour d'un document existant (partielle) :
\njson updateFields = {\n {"doc", {{"views", 42}}}\n};\nauto updateResult = client.update("articles", "article", "1", updateFields.dump());\n\nRecherche et filtrage
\nExécution d'une recherche en texte intégral avec Query DSL :
\njson 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