Elasticsearch 客户端 for Swift (iOS/macOS) — 完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

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)") }}


更新和删除



更新年龄字段

推荐