عميل Elasticsearch للغة C++: elasticlient ودليل شامل

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

عميل Elasticsearch للغة C++: دليل شامل لـ elasticlient

\n\n

Elasticsearch هو نظام بحث موزع وقوي مبني على Apache Lucene. للتفاعل معه من لغة C++، توجد عدة مكتبات. في هذه المقالة، سنستعرض بالتفصيل elasticlient - وهو عميل خفيف الوزن وحديث وسهل الاستخدام، يستخدم مكتبة libcurl لطلبات HTTP و nlohmann/json للعمل مع JSON. إنه مثالي لدمج وظائف البحث في التطبيقات الأصلية والمكونات الخادمة وأدوات تحليل البيانات.

\n\n

الميزات الرئيسية لـ elasticlient

\n
    \n
  • دعم جميع العمليات الأساسية لـ Elasticsearch: الفهرسة، التحديث، حذف المستندات.
  • \n
  • تنفيذ استعلامات بحث بالنص الكامل مع عوامل التصفية والتجميعات.
  • \n
  • إدارة الفهارس: إنشاء، حذف، تكوين التعيينات (mappings).
  • \n
  • المعالجة المجمعة (bulk) للأداء العالي.
  • \n
  • دعم SSL/TLS والمصادقة الأساسية.
  • \n
  • طلبات غير متزامنة عبر آليات الاستدعاء (callback).
  • \n
\n\n

تثبيت المكتبة

\n

لبناء elasticlient، ستحتاج إلى مترجم يدعم C++17 والتبعيات المثبتة: libcurl (للتطوير) و nlohmann-json. التثبيت عبر مدير الحزم (Ubuntu/Debian):

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

البناء من المصدر:

\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

الاتصال الأساسي والإعدادات

\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:

\n
elasticlient::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):

\n
auto 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

تحديث مستند موجود (تحديث جزئي):

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

البحث والتصفية

\n

تنفيذ بحث بالنص الكامل باستخدام Query DSL:

\n
json 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                    

توصيات