这个库允许你从你的 Vapor 应用程序连接到 Elasticsearch 服务器,执行搜索并获取 Codable/Content 结果。目前只支持搜索,不支持索引和数据操作。
将 Elasticsearch 服务添加到你的 Package.swift 文件中
.package(url: "https://github.com/monstar-lab/elasticsearch-service.git", from: "0.9.0")
在你的 configure.swift 文件中注册配置对象和 provider
let elasticURL = URL(string: "https://:9200")
if let elasticURL = elasticURL {
let elasticConfig = ElasticsearchConfig(serverURL: elasticURL)
services.register(elasticConfig)
try services.register(ElasticsearchProvider())
}
导入 ElasticsearchService 并从你的容器中获取 ElasticsearchClient 实例后,你可以发送你的搜索请求(可以包装在 QueryContainer 中,或者对于复杂的查询,可以使用简单的 [AnyHashable: Any]),并接收搜索结果(同样可以作为自定义 Codable 结构,或者作为 [AnyHashable: Any])。
QueryContainer 和符合 Query 协议的 struct 允许你以类型安全、Swift 风格的方式建模你的查询。然而,并非 Elasticsearch 的所有查询语言都被转换了,只有最常用的查询。如果缺少你需要的查询,请随意提交 pull request。
func getSearchHandler(_ req: Request) throws -> Future<[Product]> {
let elasticClient = try req.make(ElasticsearchClient.self)
let query = QueryContainer(
Query(
Fuzzy(key: "name", value: "bolster", transpositions: true)
)
)
return try elasticClient
.search(index: "product", query, decodeTo: Product.self)
.map(to: [Product].self) { result in
return result.hits.hits.map { $0.source }
}
}
更多示例,请随时查看测试套件或注释。
BoolQuery 的用处。例如,如果你传递类型 [MatchPhrase] 作为 must 参数,其他参数(filter、mustNot 等)也必须是 [MatchPhrase] 类型。如果你知道如何解决这个问题(类型擦除?),非常欢迎提交 pull request!