Client Elasticsearch pour Swift (iOS/macOS)
Elasticsearch est un puissant système de recherche distribué construit sur Apache Lucene. Pour les développeurs iOS et macOS, le client officiel elasticsearch-swift est disponible, offrant une interface pratique pour travailler avec Elasticsearch depuis des applications Swift. La bibliothèque prend entièrement en charge l'API REST d'Elasticsearch, y compris l'indexation, la recherche, les agrégations et la gestion du cluster.
Installation et configuration
Le client est distribué via Swift Package Manager (SPM). Pour l'ajouter à un projet :
// Dans Package.swiftdependencies: [ .package(url: "https://github.com/elastic/elasticsearch-swift.git", from: "8.10.0")]Ou via Xcode : File → Add Packages → saisissez l'URL du dépôt. Après l'installation, importez la bibliothèque :
import ElasticsearchFonctionnalités principales
- Indexation de documents — ajout, mise à jour et suppression d'enregistrements dans les index.
- Recherche — plein texte, par champs, avec filtres et tri.
- Agrégations — calculs statistiques, regroupements, histogrammes.
- Gestion du cluster — création/suppression d'index, configuration des shards et des répliques.
- Prise en charge d'async/await — requêtes asynchrones utilisant le modèle moderne Swift Concurrency.
Exemple d'utilisation : connexion et indexation
Créons un client et indexons quelques documents :
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)")}Recherche avec Query DSL
Elasticsearch prend en charge un langage de requête puissant. Exemple de recherche plein texte :
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)") } }}Agrégations pour l'analyse
Exemple de comptage du nombre de livres par année :
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") }}Gestion des index
Création et suppression d'un index avec paramètres :
let settings: [String: Any] = [ "settings": [ "number_of_shards": 2, "number_of_replicas": 1 ], "mappings": [ "pro Aussi dans la bibliothèque
Génération de rapports PDF en TypeScript : bibliothèques et outils
Internationalisation (i18n) en Rust : bibliothèques gettext-rs et fluent-rs
Cryptographie en Kotlin : chiffrement et hachage avec exemples
Files d'attente de tâches pour Rust : aperçu et exemples d'utilisation
Génération de rapports PDF en JavaScript (Node.js) : Aperçu des bibliothèques et exemples de code