عميل Elasticsearch للغة C++: دليل شامل لـ elasticlient
\n\nElasticsearch هو نظام بحث موزع وقوي مبني على Apache Lucene. للتفاعل معه من لغة C++، توجد عدة مكتبات. في هذه المقالة، سنستعرض بالتفصيل elasticlient - وهو عميل خفيف الوزن وحديث وسهل الاستخدام، يستخدم مكتبة libcurl لطلبات HTTP و nlohmann/json للعمل مع JSON. إنه مثالي لدمج وظائف البحث في التطبيقات الأصلية والمكونات الخادمة وأدوات تحليل البيانات.
الميزات الرئيسية لـ elasticlient
\n- \n
- دعم جميع العمليات الأساسية لـ Elasticsearch: الفهرسة، التحديث، حذف المستندات. \n
- تنفيذ استعلامات بحث بالنص الكامل مع عوامل التصفية والتجميعات. \n
- إدارة الفهارس: إنشاء، حذف، تكوين التعيينات (mappings). \n
- المعالجة المجمعة (bulk) للأداء العالي. \n
- دعم SSL/TLS والمصادقة الأساسية. \n
- طلبات غير متزامنة عبر آليات الاستدعاء (callback). \n
تثبيت المكتبة
\nلبناء elasticlient، ستحتاج إلى مترجم يدعم C++17 والتبعيات المثبتة: libcurl (للتطوير) و nlohmann-json. التثبيت عبر مدير الحزم (Ubuntu/Debian):
sudo apt install libcurl4-openssl-dev nlohmann-json3-dev cmake g++\nالبناء من المصدر:
\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\nالاتصال الأساسي والإعدادات
\nللبدء، قم بإنشاء نسخة من العميل مع تحديد URL لمجموعة Elasticsearch الخاصة بك:
\n#include <elasticlient/client.h>\n#include <iostream>\n\nint main() {\n elasticlient::Client client({"http://localhost:9200"});\n // التحقق من الاتصال\n auto ping = client.ping();\n if (ping.status() == 200) {\n std::cout << "تم إنشاء الاتصال!" << std::endl;\n }\n return 0;\n}\nلمجموعة تحتوي على عدة عقد، قم بتمرير قائمة عناوين URL:
\nelasticlient::Client client({\n "http://node1:9200",\n "http://node2:9200",\n "http://node3:9200"\n});\n\nالعمل مع المستندات
\nفهرسة مستند جديد (إنشاء أو تحديث):
\n#include <nlohmann/json.hpp>\nusing json = nlohmann::json;\n\njson doc = {\n {"title", "Elasticsearch للغة C++"},\n {"content", "دليل شامل لاستخدام عميل elasticlient"},\n {"tags", {"cpp", "elasticsearch", "بحث"}},\n {"views", 0}\n};\n\nauto result = client.index("articles", "article", doc.dump(), "1");\nif (result.status() == 201) {\n std::cout << "تم إنشاء المستند: " << result.body() << std::endl;\n}\nالحصول على مستند بواسطة المعرف (ID):
\nauto getResult = client.get("articles", "article", "1");\nif (getResult.status() == 200) {\n json docJson = json::parse(getResult.body());\n std::cout << "العنوان: " << docJson["_source"]["title"] << std::endl;\n}\nتحديث مستند موجود (تحديث جزئي):
\njson updateFields = {\n {"doc", {{"views", 42}}}\n};\nauto updateResult = client.update("articles", "article", "1", updateFields.dump());\n\nالبحث والتصفية
\nتنفيذ بحث بالنص الكامل باستخدام Query DSL:
\njson searchQuery = {\n {"query", {\n {"bool", {\n {"must", {\n {{"match", {{"content", "دليل"}}}}\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 أيضاً في المكتبة
قوائم المهام في Kotlin: Coroutines وKJob والأنماط المتقدمة
توليد PDF في TypeScript: نظرة عامة على المكتبات والأدوات
تسجيل الدخول في Rust: نظرة عامة على أفضل المكتبات والأدوات
إرسال البريد الإلكتروني في Kotlin: المكتبات وأمثلة الكود