Elasticsearch 客户端 for Swift (iOS/macOS):集成与示例

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

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

开始课程

Elasticsearch 客户端 for Swift (iOS/macOS)

Elasticsearch 是一个基于 Apache Lucene 构建的强大分布式搜索引擎。对于 iOS 和 macOS 开发者,官方客户端 elasticsearch-swift 提供了一个便捷的接口,用于在 Swift 应用程序中与 Elasticsearch 进行交互。该库完全支持 Elasticsearch 的 REST API,包括索引、搜索、聚合和集群管理。



安装与配置

该客户端通过 Swift Package Manager (SPM) 分发。要将其添加到项目中:

// 在 Package.swift 中dependencies: [    .package(url: "https://github.com/elastic/elasticsearch-swift.git", from: "8.10.0")]

或者通过 Xcode:文件 → 添加包 → 输入仓库 URL。安装后,导入该库:

import Elasticsearch


主要功能

  • 文档索引 — 在索引中添加、更新和删除记录。
  • 搜索 — 全文搜索、按字段搜索、带过滤和排序。
  • 聚合 — 统计计算、分组、直方图。
  • 集群管理 — 创建/删除索引、配置分片和副本。
  • 支持 async/await — 使用现代 Swift Concurrency 模型的异步请求。


使用示例:连接与索引

创建一个客户端并索引几个文档:

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


使用 Query DSL 进行搜索

Elasticsearch 支持强大的查询语言。全文搜索示例:

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


用于分析的聚合

按年份统计书籍数量的示例:

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


索引管理

创建和删除带配置的索引:

let settings: [String: Any] = [    "settings": [        "number_of_shards": 2,        "number_of_replicas": 1    ],    "mappings": [        "pro                    

推荐