Elasticsearch 客户端 for Swift (iOS/macOS)
Elasticsearch 是一个基于 Apache Lucene 构建的强大分布式搜索和分析引擎。为了与 Swift (iOS/macOS) 的移动和桌面应用程序集成,存在一个专门的客户端 Elasticsearch Swift。该库提供了一个便捷的 API,用于直接从 Apple 应用程序执行搜索查询、数据索引、聚合和集群管理。
库的主要功能
- 全文搜索 — 支持所有类型的 Elasticsearch 查询(match、term、bool、fuzzy 等)
- CRUD 操作 — 在索引中创建、读取、更新和删除文档
- 聚合 — 构建复杂的分析报告(terms、range、date_histogram 等)
- 批量处理 — 用于批量数据加载的 bulk 操作
- 异步支持 — 通过 async/await 和 Combine 工作
- SSL/TLS 和身份验证 — 安全连接到集群
安装
通过 Swift Package Manager 添加库。在 Xcode 中选择 File → Add Packages 并输入仓库 URL:
https://github.com/elastic/elasticsearch-swift.git或者将依赖项添加到 Package.swift:
dependencies: [ .package(url: "https://github.com/elastic/elasticsearch-swift.git", from: "1.0.0")]客户端初始化
创建一个 ElasticsearchClient 实例,指定 Elasticsearch 的主机和端口:
import Elasticsearch
let client = ElasticsearchClient( host: "http://localhost:9200", username: "elastic", password: "changeme")要连接到云 Elastic Cloud,请使用带有 URL 和 API 密钥的构造函数:
let client = ElasticsearchClient( cloudID: "my-cluster:dXM...", apiKey: "base64EncodedApiKey")文档索引
让我们创建一个简单的用户模型并为其建立索引:
struct User: Codable { let name: String let email: String let age: Int}
let user = User(name: "阿列克谢", email: "alex@example.com", age: 30)
Task { let response = try await client.index( index: "users", id: "1", body: user ) print("文档已创建: \\(response.result)")}文档搜索
使用 match 查询按名称搜索用户:
let searchQuery: [String: Any] = [ "query": [ "match": [ "name": "阿列克谢" ] ]]
Task { let response = try await client.search( index: "users", body: searchQuery ) if let hits = response.hits?.hits { for hit in hits { if let source = hit.source as? [String: Any] { print("找到: \\(source["name"] ?? "")") } } }}聚合
构建用户年龄的直方图:
let aggregationQuery: [String: Any] = [ "size": 0, "aggs": [ "age_ranges": [ "range": [ "field": "age", "ranges": [ ["to": 20], ["from": 20, "to": 40], ["from": 40] ] ] ] ]]
Task { let response = try await client.search( index: "users", body: aggregationQuery ) if let buckets = response.aggregations?["age_ranges"] as? [String: Any] { print("聚合结果: \\(buckets)") }}更新和删除
更新年龄字段