Elasticsearch C++-Client: Ein leistungsstarkes Werkzeug für die Hochleistungssuche
Elasticsearch ist ein verteiltes Suchsystem auf Basis von Apache Lucene, das häufig für die Volltextsuche, Log-Analyse und die Verarbeitung großer Datenmengen eingesetzt wird. Obwohl ein offizieller Client für C++ fehlt, können Entwickler effektiv über die REST API mit Elasticsearch interagieren, und zwar mit der Bibliothek elasticlient – einem leichtgewichtigen C++-Client, der speziell für die Arbeit mit Elasticsearch entwickelt wurde.
Die Bibliothek elasticlient bietet eine benutzerfreundliche Schnittstelle für alle grundlegenden Operationen: Indizierung von Dokumenten, Suche, Aktualisierung, Löschung und Cluster-Verwaltung. Sie basiert auf der Bibliothek libcurl für HTTP-Anfragen und nlohmann/json für die Arbeit mit JSON, was eine hohe Leistung und Kompatibilität mit modernen C++17/20-Standards gewährleistet.
Hauptfunktionen von elasticlient
- Vollständige Unterstützung der Elasticsearch REST API (Versionen 6.x, 7.x und 8.x)
- Asynchrone und synchrone Anfragen
- Automatische Serialisierung/Deserialisierung von JSON über nlohmann/json
- Unterstützung von Bulk-Operationen für den Massendatenimport
- Index-Verwaltung (Erstellen, Löschen, Mapping-Konfiguration)
- Arbeit mit Suchanfragen (match, term, range, bool u. a.)
- Fehlerbehandlung und erneute Verbindungsversuche
Installation und Konfiguration
Für die Installation von elasticlient können Sie CMake und vcpkg verwenden oder manuell kompilieren. Die empfohlene Methode ist die Verwendung von vcpkg:
# Installation über vcpkgvcpkg install elasticlient
# Einbindung in CMakeLists.txtfind_package(elasticlient REQUIRED)target_link_libraries(my_app PRIVATE elasticlient::elasticlient)Außerdem werden folgende Abhängigkeiten benötigt:
- libcurl (mit HTTPS-Unterstützung)
- nlohmann/json (Version 3.9+)
- C++-Compiler mit C++17-Unterstützung (GCC 8+, Clang 7+, MSVC 2019+)
Grundlegende Anwendungsbeispiele
Verbindung zu Elasticsearch herstellen
#include <elasticlient/client.h>
int main() { // Client erstellen und mit lokaler Instanz verbinden elasticlient::Client client("http://localhost:9200"); // Verbindung prüfen auto status = client.get("/"); if (status.statusCode() == 200) { std::cout << "Connected to Elasticsearch!" << std::endl; } return 0;}Dokument indizieren
#include <elasticlient/client.h>#include <nlohmann/json.hpp>
using json = nlohmann::json;
int main() { elasticlient::Client client("http://localhost:9200"); // Dokument erstellen json document = { {"title", "Einführung in C++"}, {"author", "Ivan Petrov"}, {"year", 2023}, {"tags", {"Programmierung", "C++", "Lehrbuch"}} }; // Indizierung im Index "books" mit der ID "1" auto response = client.index("books", "_doc", "1", document.dump()); if (response.statusCode() == 201) { std::cout << "Document indexed successfully!" << std::endl; } return 0;}Dokumente suchen
#include <elasticlient/client.h>#include <iostream>
int main() { elasticlient::Client client("http://localhost:9200"); // Suchanfrage json query = { {"query", { {"match", { {"title", "C++"} }} }} }; auto response = client.search("books", "_search", query.dump()); if (response.statusCode() == 200) { auto results = json::parse(response.body()); for (const auto& hit : results["hits"]["hits"]) { std::cout << "Found: " << hit["_source"]["title"] << std::endl; } } retu