عميل Elasticsearch لتطبيقات Swift (iOS/macOS)
\n\nElasticsearch هو نظام بحث وتحليلات موزع قوي مبني على 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أضف المكتبة عبر Swift Package Manager. في Xcode، اختر File → Add Packages وأدخل رابط المستودع:
https://github.com/elastic/elasticsearch-swift.git\n\nأو أضف التبعية في ملف Package.swift:
dependencies: [\n .package(url: "https://github.com/elastic/elasticsearch-swift.git", from: "1.0.0")\n]\n\nتهيئة العميل
\n\nقم بإنشاء نسخة من ElasticsearchClient مع تحديد المضيف والمنفذ لـ Elasticsearch:
import Elasticsearch\n\nlet client = ElasticsearchClient(\n host: "http://localhost:9200",\n username: "elastic",\n password: "changeme"\n)\n\nللاتصال بـ Elastic Cloud السحابي، استخدم المُنشئ مع الرابط ومفتاح API:
\n\nlet client = ElasticsearchClient(\n cloudID: "my-cluster:dXM...",\n apiKey: "base64EncodedApiKey"\n)\n\nفهرسة المستندات
\n\nلنقم بإنشاء نموذج مستخدم بسيط وفهرسته:
\n\nstruct 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\nlet 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\nlet 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تحديث عمر المستخدم