عميل Elasticsearch لـ Swift (iOS/macOS): التكامل والأمثلة

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

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

ابدأ الدورة

عميل Elasticsearch لـ Swift (iOS/macOS)

Elasticsearch هو نظام بحث موزع قوي مبني على Apache Lucene. للمطورين على iOS وmacOS، يتوفر عميل رسمي elasticsearch-swift يوفر واجهة سهلة للعمل مع Elasticsearch من تطبيقات Swift. تدعم المكتبة بالكامل REST API الخاص بـ Elasticsearch، بما في ذلك الفهرسة والبحث والتجميعات وإدارة الكتلة.



التثبيت والإعداد

يتم توزيع العميل عبر Swift Package Manager (SPM). للإضافة إلى المشروع:

// في ملف Package.swiftdependencies: [    .package(url: "https://github.com/elastic/elasticsearch-swift.git", from: "8.10.0")]

أو عبر Xcode: File → Add Packages → أدخل رابط المستودع. بعد التثبيت، قم باستيراد المكتبة:

import Elasticsearch


الإمكانيات الأساسية

  • فهرسة المستندات — إضافة وتحديث وحذف السجلات في الفهارس.
  • البحث — بحث نصي كامل، حسب الحقول، مع عوامل تصفية وترتيب.
  • التجميعات — حسابات إحصائية، تجميعات، رسوم بيانية.
  • إدارة الكتلة — إنشاء/حذف الفهارس، إعداد القطع والنسخ المتماثلة.
  • دعم async/await — طلبات غير متزامنة باستخدام نموذج Swift Concurrency الحديث.


مثال استخدام: الاتصال والفهرسة

لنقم بإنشاء عميل وفهرسة بعض المستندات:

import Elasticsearch

let client = ElasticsearchClient( host: "https://your-cluster-url:9200", apiKey: "your-api-key")

struct Book: Codable { let id: String let title: String let author: String let year: Int}

let books = [ Book(id: "1", title: "Swift Programming", author: "John Doe", year: 2023), Book(id: "2", title: "iOS Development", author: "Jane Smith", year: 2024)]

for book in books { let response = try await client.index( index: "books", id: book.id, body: book ) print("Indexed: \\(response.result)")}


البحث باستخدام Query DSL

يدعم Elasticsearch لغة استعلام قوية. مثال على البحث النصي الكامل:

import Elasticsearch

let query: [String: Any] = [ "query": [ "bool": [ "must": [ ["match": ["title": "Swift"]] ], "filter": [ ["range": ["year": ["gte": 2023]]] ] ] ]]

let searchResponse = try await client.search( index: "books", body: query)

if let hits = searchResponse.hits?.hits { for hit in hits { if let source = hit.source { let book = try JSONDecoder().decode(Book.self, from: source) print("Found: \\(book.title) by \\(book.author)") } }}


التجميعات للتحليلات

مثال لحساب عدد الكتب حسب السنوات:

let aggregationQuery: [String: Any] = [    "size": 0,    "aggs": [        "by_year": [            "terms": ["field": "year", "size": 10]        ]    ]]

let aggResponse = try await client.search( index: "books", body: aggregationQuery)

if let buckets = aggResponse.aggregations?["by_year"] as? [String: Any], let bucketList = buckets["buckets"] as? [[String: Any]] { for bucket in bucketList { let year = bucket["key"] as? Int ?? 0 let count = bucket["doc_count"] as? Int ?? 0 print("\\(year): \\(count) books") }}


إدارة الفهارس

إنشاء وحذف فهرس مع الإعدادات:

let settings: [String: Any] = [    "settings": [        "number_of_shards": 2,        "number_of_replicas": 1    ],    "mappings": [        "pro                    

توصيات