Elasticsearch-Client für C++: vollständige Anleitung zu elasticlient
\n\nElasticsearch ist ein leistungsstarkes verteiltes Suchsystem, das auf Apache Lucene basiert. Für die Interaktion mit Elasticsearch aus C++ heraus gibt es mehrere Bibliotheken. In diesem Artikel betrachten wir ausführlich elasticlient – einen leichten, modernen und benutzerfreundlichen Client, der die Bibliothek libcurl für HTTP-Anfragen und nlohmann/json für die Arbeit mit JSON verwendet. Er eignet sich ideal zum Einbetten von Suchfunktionen in native Anwendungen, Serverkomponenten und Datenanalyse-Tools.
Hauptfunktionen von elasticlient
\n- \n
- Unterstützung aller grundlegenden Elasticsearch-Operationen: Indizierung, Aktualisierung, Löschen von Dokumenten. \n
- Ausführung von Suchanfragen mit Volltextsuche, Filtern und Aggregationen. \n
- Verwaltung von Indizes: Erstellen, Löschen, Konfigurieren von Mappings. \n
- Stapelverarbeitung (Bulk) für hohe Leistung. \n
- Unterstützung von SSL/TLS und Basisauthentifizierung. \n
- Asynchrone Anfragen über Callback-Mechanismen. \n
Installation der Bibliothek
\nZum Erstellen von elasticlient wird ein Compiler mit C++17-Unterstützung sowie die installierten Abhängigkeiten libcurl (Entwicklung) und nlohmann-json benötigt. Installation über den Paketmanager (Ubuntu/Debian):
sudo apt install libcurl4-openssl-dev nlohmann-json3-dev cmake g++\nErstellung aus dem Quellcode:
\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\nGrundlegende Verbindung und Konfiguration
\nErstellen Sie zunächst eine Client-Instanz, indem Sie die URL Ihres Elasticsearch-Clusters angeben:
\n#include <elasticlient/client.h>\n#include <iostream>\n\nint main() {\n elasticlient::Client client({"http://localhost:9200"});\n // Verbindung prüfen\n auto ping = client.ping();\n if (ping.status() == 200) {\n std::cout << "Verbindung hergestellt!" << std::endl;\n }\n return 0;\n}\nFür einen Cluster mit mehreren Knoten übergeben Sie eine Liste von URLs:
\nelasticlient::Client client({\n "http://node1:9200",\n "http://node2:9200",\n "http://node3:9200"\n});\n\nArbeit mit Dokumenten
\nIndizierung eines neuen Dokuments (Erstellen oder Aktualisieren):
\n#include <nlohmann/json.hpp>\nusing json = nlohmann::json;\n\njson doc = {\n {"title", "Elasticsearch für C++"},\n {"content", "Ausführliche Anleitung zur Verwendung des elasticlient-Clients"},\n {"tags", {"cpp", "elasticsearch", "suche"}},\n {"views", 0}\n};\n\nauto result = client.index("articles", "article", doc.dump(), "1");\nif (result.status() == 201) {\n std::cout << "Dokument erstellt: " << result.body() << std::endl;\n}\nAbrufen eines Dokuments anhand der ID:
\nauto getResult = client.get("articles", "article", "1");\nif (getResult.status() == 200) {\n json docJson = json::parse(getResult.body());\n std::cout << "Titel: " << docJson["_source"]["title"] << std::endl;\n}\nAktualisieren eines vorhandenen Dokuments (teilweise):
\njson updateFields = {\n {"doc", {{"views", 42}}}\n};\nauto updateResult = client.update("articles", "article", "1", updateFields.dump());\n\nSuche und Filterung
\nAusführung einer Volltextsuche mit Query DSL:
\njson searchQuery = {\n {"query", {\n {"bool", {\n {"must", {\n {{"match", {{"content", "anleitung"}}}}\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 Auch in der Bibliothek
Arbeit mit XML in Rust: Bibliotheken roxmltree, quick-xml und serde-xml-rs
Logging in Swift (iOS/macOS): SwiftyBeaver, XCGLogger, OSLog
Event Bus und das Observer-Pattern in Go (Golang): pub/sub-Implementierung
Prometheus-Metriken in Swift: Integration für iOS/macOS-Apps
gRPC für C++: Komplettguide mit Praxisbeispielen