Elasticsearch-Client für Swift (iOS/macOS)
\n\nElasticsearch ist ein leistungsstarkes, verteiltes Such- und Analysesystem, das auf Apache Lucene basiert. Für die Integration mit mobilen und Desktop-Anwendungen in Swift (iOS/macOS) gibt es den spezialisierten Client Elasticsearch Swift. Diese Bibliothek bietet eine praktische API für Suchanfragen, Datenindizierung, Aggregationen und Cluster-Verwaltung direkt aus Apple-Anwendungen.
\n\nHauptfunktionen der Bibliothek
\n\n- \n
- Volltextsuche – Unterstützung aller Elasticsearch-Abfragetypen (match, term, bool, fuzzy usw.) \n
- CRUD-Operationen – Erstellen, Lesen, Aktualisieren und Löschen von Dokumenten in Indizes \n
- Aggregationen – Erstellung komplexer Analyseberichte (terms, range, date_histogram usw.) \n
- Stapelverarbeitung – Bulk-Operationen für die Massendatenverarbeitung \n
- Asynchrone Unterstützung – Arbeit mit async/await und Combine \n
- SSL/TLS und Authentifizierung – Sichere Verbindung zum Cluster \n
Installation
\n\nFügen Sie die Bibliothek über den Swift Package Manager hinzu. Wählen Sie in Xcode File → Add Packages und geben Sie die Repository-URL ein:
https://github.com/elastic/elasticsearch-swift.git\n\nOder fügen Sie die Abhängigkeit in Package.swift hinzu:
dependencies: [\n .package(url: "https://github.com/elastic/elasticsearch-swift.git", from: "1.0.0")\n]\n\nClient-Initialisierung
\n\nErstellen Sie eine Instanz von ElasticsearchClient mit Angabe des Elasticsearch-Hosts und -Ports:
import Elasticsearch\n\nlet client = ElasticsearchClient(\n host: "http://localhost:9200",\n username: "elastic",\n password: "changeme"\n)\n\nFür die Verbindung zur Elastic Cloud verwenden Sie den Konstruktor mit URL und API-Schlüssel:
\n\nlet client = ElasticsearchClient(\n cloudID: "my-cluster:dXM...",\n apiKey: "base64EncodedApiKey"\n)\n\nDokumentenindizierung
\n\nErstellen wir ein einfaches Benutzermodell und indizieren es:
\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("Dokument erstellt: \\(response.result)")\n}\n\nDokumentensuche
\n\nSuche nach Benutzern anhand des Namens mit einer match-Abfrage:
\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("Gefunden: \\(source["name"] ?? "")")\n }\n }\n }\n}\n\nAggregationen
\n\nErstellen wir ein Histogramm nach Benutzeralter:
\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("Aggregationsergebnisse: \\(buckets)")\n }\n}\n\nAktualisierung und Löschung
\n\nAktualisierung des Alters von