عميل Elasticsearch لتطبيقات Swift (iOS/macOS) — دليل شامل

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

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

ابدأ الدورة

عميل Elasticsearch لتطبيقات Swift (iOS/macOS)

\n\n

Elasticsearch هو نظام بحث وتحليلات موزع قوي مبني على Apache Lucene. للتكامل مع تطبيقات الأجهزة المحمولة وسطح المكتب بلغة Swift (iOS/macOS)، يوجد عميل متخصص Elasticsearch Swift. توفر هذه المكتبة واجهة برمجة تطبيقات (API) ملائمة لتنفيذ استعلامات البحث، فهرسة البيانات، التجميعات، وإدارة الكتلة مباشرة من تطبيقات Apple.

\n\n

الميزات الرئيسية للمكتبة

\n\n
    \n
  • البحث النصي الكامل — دعم جميع أنواع استعلامات Elasticsearch (match, term, bool, fuzzy وغيرها)
  • \n
  • عمليات CRUD — إنشاء وقراءة وتحديث وحذف المستندات في الفهارس
  • \n
  • التجميعات — بناء تقارير تحليلية معقدة (terms, range, date_histogram إلخ)
  • \n
  • المعالجة المجمعة — عمليات bulk لتحميل البيانات بكميات كبيرة
  • \n
  • دعم التزامن غير المتزامن — العمل عبر async/await وCombine
  • \n
  • SSL/TLS والمصادقة — اتصال آمن بالكتلة
  • \n
\n\n

التثبيت

\n\n

أضف المكتبة عبر Swift Package Manager. في Xcode، اختر File → Add Packages وأدخل رابط المستودع:

\n\n
https://github.com/elastic/elasticsearch-swift.git
\n\n

أو أضف التبعية في ملف Package.swift:

\n\n
dependencies: [\n    .package(url: "https://github.com/elastic/elasticsearch-swift.git", from: "1.0.0")\n]
\n\n

تهيئة العميل

\n\n

قم بإنشاء نسخة من ElasticsearchClient مع تحديد المضيف والمنفذ لـ Elasticsearch:

\n\n
import Elasticsearch\n\nlet client = ElasticsearchClient(\n    host: "http://localhost:9200",\n    username: "elastic",\n    password: "changeme"\n)
\n\n

للاتصال بـ Elastic Cloud السحابي، استخدم المُنشئ مع الرابط ومفتاح API:

\n\n
let client = ElasticsearchClient(\n    cloudID: "my-cluster:dXM...",\n    apiKey: "base64EncodedApiKey"\n)
\n\n

فهرسة المستندات

\n\n

لنقم بإنشاء نموذج مستخدم بسيط وفهرسته:

\n\n
struct User: Codable {\n    let name: String\n    let email: String\n    let age: Int\n}\n\nlet user = User(name: "أليكسي", email: "alex@example.com", age: 30)\n\nTask {\n    let response = try await client.index(\n        index: "users",\n        id: "1",\n        body: user\n    )\n    print("تم إنشاء المستند: \\(response.result)")\n}
\n\n

البحث عن المستندات

\n\n

البحث عن المستخدمين حسب الاسم باستخدام استعلام match:

\n\n
let searchQuery: [String: Any] = [\n    "query": [\n        "match": [\n            "name": "أليكسي"\n        ]\n    ]\n]\n\nTask {\n    let response = try await client.search(\n        index: "users",\n        body: searchQuery\n    )\n    \n    if let hits = response.hits?.hits {\n        for hit in hits {\n            if let source = hit.source as? [String: Any] {\n                print("تم العثور على: \\(source["name"] ?? "")")\n            }\n        }\n    }\n}
\n\n

التجميعات

\n\n

لنقم ببناء رسم بياني حسب عمر المستخدمين:

\n\n
let aggregationQuery: [String: Any] = [\n    "size": 0,\n    "aggs": [\n        "age_ranges": [\n            "range": [\n                "field": "age",\n                "ranges": [\n                    ["to": 20],\n                    ["from": 20, "to": 40],\n                    ["from": 40]\n                ]\n            ]\n        ]\n    ]\n]\n\nTask {\n    let response = try await client.search(\n        index: "users",\n        body: aggregationQuery\n    )\n    \n    if let buckets = response.aggregations?["age_ranges"] as? [String: Any] {\n        print("نتائج التجميع: \\(buckets)")\n    }\n}
\n\n

التحديث والحذف

\n\n

تحديث عمر المستخدم

توصيات