Client Elasticsearch pour Swift (iOS/macOS)
\n\nElasticsearch est un puissant système de recherche et d'analyse distribué, construit sur Apache Lucene. Pour l'intégration avec les applications mobiles et de bureau en Swift (iOS/macOS), il existe un client spécialisé Elasticsearch Swift. Cette bibliothèque fournit une API pratique pour exécuter des requêtes de recherche, indexer des données, effectuer des agrégations et gérer le cluster directement depuis les applications Apple.
\n\nFonctionnalités principales de la bibliothèque
\n\n- \n
- Recherche en texte intégral — prise en charge de tous les types de requêtes Elasticsearch (match, term, bool, fuzzy, etc.) \n
- Opérations CRUD — création, lecture, mise à jour et suppression de documents dans les index \n
- Agrégations — construction de rapports analytiques complexes (terms, range, date_histogram, etc.) \n
- Traitement par lots — opérations bulk pour le chargement massif de données \n
- Prise en charge de l'asynchrone — fonctionnement via async/await et Combine \n
- SSL/TLS et authentification — connexion sécurisée au cluster \n
Installation
\n\nAjoutez la bibliothèque via Swift Package Manager. Dans Xcode, sélectionnez File → Add Packages et saisissez l'URL du dépôt :
https://github.com/elastic/elasticsearch-swift.git\n\nOu ajoutez la dépendance dans Package.swift :
dependencies: [\n .package(url: "https://github.com/elastic/elasticsearch-swift.git", from: "1.0.0")\n]\n\nInitialisation du client
\n\nCréez une instance de ElasticsearchClient en spécifiant l'hôte et le port d'Elasticsearch :
import Elasticsearch\n\nlet client = ElasticsearchClient(\n host: "http://localhost:9200",\n username: "elastic",\n password: "changeme"\n)\n\nPour vous connecter à Elastic Cloud, utilisez le constructeur avec l'URL et la clé API :
\n\nlet client = ElasticsearchClient(\n cloudID: "my-cluster:dXM...",\n apiKey: "base64EncodedApiKey"\n)\n\nIndexation de documents
\n\nCréons un modèle utilisateur simple et indexons-le :
\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("Document créé : \\(response.result)")\n}\n\nRecherche de documents
\n\nRecherche d'utilisateurs par nom à l'aide d'une requête 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("Trouvé : \\(source["name"] ?? "")")\n }\n }\n }\n}\n\nAgrégations
\n\nConstruisons un histogramme par âge des utilisateurs :
\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("Résultats de l'agrégation : \\(buckets)")\n }\n}\n\nMise à jour et suppression
\n\nMise à jour de l'âge de l'utilisateur