ElasticSwift
项目状态
该项目正在积极开发中,更多信息将在项目进展中提供。
如果您想贡献,欢迎提交拉取请求。
-
支持 macOS、iOS 和 Linux 平台。
-
查询 DSL 构建器和辅助工具,类似于 elasticsearch Java 客户端。查看下表以查看可用 QueryBuilders 的完整列表。
项目目标
我们的目标是创建一个高度 Swift 化和性能高效的 elasticsearch 客户端。
高度性能意味着在 100 毫秒内提供最终用户的响应,不包括 elasticsearch 处理请求的时间。
安装
CocoaPods
CocoaPods 是一个 Cocoa 项目的依赖管理器。您可以使用以下命令安装它:
$ gem install cocoapods
构建 ElasticSwift 需要 CocoaPods 1.6.0+。
要使用 CocoaPods 将 Elasticswift 集成到您的 Xcode 项目中,请在您的 Podfile
中指定它:
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '10.0'
use_frameworks!
target '<Your Target Name>' do
pod 'ElasticSwift', '~> 1.0.0-beta.1'
pod 'ElasticSwiftCore', '~> 1.0.0-beta.1'
pod 'ElasticSwiftQueryDSL', '~> 1.0.0-beta.1'
pod 'ElasticSwiftCodableUtils', '~> 1.0.0-beta.1'
pod 'ElasticSwiftNetworking', '~> 1.0.0-beta.1'
end
注意:ElasticSwiftNetworkingNIO 并未作为 pod 提供
然后,运行以下命令:
$ pod install
Swift 包管理器
Swift 包管理器是一个用于自动化 Swift 代码分布的工具,它集成到了 Swift 编译器中。尽管目前处于早期开发阶段,但 ElasticSwift 在支持的平台上是支持使用 Swift 包管理器的。
一旦您的 Swift 包设置完成,只需将它添加到 Package.swift 中的依赖值,就可以轻松地将 ElasticSwift 添加为依赖项。
dependencies: [
.package(url: "https://github.com/pksprojects/ElasticSwift.git", from: "1.0.0-beta.1")
]
然后,将适当的 ElasticSwift 模块添加到您的目标依赖项中。添加目标依赖项的语法在不同版本的 Swift 中略有不同。例如,如果您想依赖 ElasticSwift
和 ElasticSwiftCore
模块,请指定以下依赖项:
swift-tools-version:5.[01]
)
Swift 5.0 和 5.1 ( dependencies: ["ElasticSwift", "ElasticSwiftCore"]
swift-tools-version:5.2
)
Swift 5.2 ( dependencies: [.product(name: "ElasticSwift", package: "elastic-swift"),
.product(name: "ElasticSwiftCore", package: "elastic-swift")]
用法
客户端
创建 设置
和 ElasticClient
。
使用 ElasticSwiftNetworking
(基于 URLSession
的实现)
import ElasticSwift
import ElasticSwiftNetworking
var settings = Settings(forHost: "https://:9200", adaptorConfig: URLSessionAdaptorConfiguration.default) // Creates default settings for client
var client = ElasticClient(settings: settings) // Creates client with specified settings
使用 ElasticSwiftNetworkingNIO
(基于 SwiftNIO/AsyncHTTPClient
的实现)
import ElasticSwift
import ElasticSwiftNetworkingNIO
var settings = Settings(forHost: "https://:9200", adaptorConfig: AsyncHTTPClientAdaptorConfiguration.default) // Creates default settings for client
var client = ElasticClient(settings: settings) // Creates client with specified settings
添加 Elasticsearch 凭证
let cred = BasicClientCredential(username: "elastic", password: "elastic")
let settings = Settings(forHost: "https://:9200", withCredentials: cred, adaptorConfig: AsyncHTTPClientAdaptorConfiguration.default)
使用 ElasticSwiftNetworking
时配置 SSL
let certPath = "/path/to/certificate.der"
let sslConfig = SSLConfiguration(certPath: certPath, isSelf: true)
let adaptorConfig = URLSessionAdaptorConfiguration(sslConfig: sslConfig)
let settings = Settings(forHosts: ["https://samplehost:port"], withCredentials: cred, adaptorConfig: adaptorConfig)
索引
创建和删除索引
func createHandler(_ result: Result<CreateIndexResponse, Error>) -> Void {
switch result {
case .failure(let error):
print("Error", error)
case .success(let response):
print("Response", response)
}
}
// creating index
let createIndexRequest = CreateIndexRequest("indexName")
client.indices.create(createIndexRequest, completionHandler: createHandler) // executes request
// delete index
func deleteHandler(_ result: Result<AcknowledgedResponse, Error>) -> Void {
switch result {
case .failure(let error):
print("Error", error)
case .success(let response):
print("Response", response)
}
}
let deleteIndexRequest = DeleteIndexRequest("indexName")
client.indices.delete(deleteIndexRequest, completionHandler: deleteHandler) // executes request
文档
文档 CRUD
class MyClass: Codable, Equatable {
var myField: String?
}
// index document
func indexHandler(_ result: Result<IndexResponse, Error>) -> Void {
switch result {
case .failure(let error):
print("Error", error)
case .success(let response):
print("Response", response)
}
}
let mySource = MyClass()
mySource.myField = "My value"
let indexRequest = try IndexRequestBuilder<MyClass>()
.set(index: "indexName")
.set(type: "type")
.set(id: "id")
.set(source: mySource)
.build()
client.index(indexRequest, completionHandler: indexHandler)
// get document
func getHandler(_ result: Result<GetResponse<MyClass>, Error>) -> Void {
switch result {
case .failure(let error):
print("Error", error)
case .success(let response):
print("Response", response)
}
}
let getRequest = try GetRequestBuilder()
.set(id: "id")
.set(index: "indexName")
.set(type: "type")
.build()
client.get(getRequest, completionHandler: getHandler)
// delete document
func deleteHandler(_ result: Result<DeleteResponse, Error>) -> Void {
switch result {
case .failure(let error):
print("Error", error)
case .success(let response):
print("Response", response)
}
}
let deleteRequest = try DeleteRequestBuilder()
.set(index: "indexName")
.set(type: "type")
.set(id: "id")
.build()
client.delete(deleteRequest, completionHandler: deleteHandler)
查询
并非所有 QueryBuilders 都可用。未来版本将添加对更多信息查询器的支持。请查看下表以获取详细信息。
let builder = QueryBuilders.boolQuery()
let mustMatch = try QueryBuilders.matchQuery().set(field: "fieldName").set(value: "value").build()
let mustNotMatch = try QueryBuilders.matchQuery().set(field: "someFieldName").set(value: "value").build()
builder.must(query: mustMatch)
builder.mustNot(query: mustNotMatch)
let boolQuery = try builder.build()
搜索
创建简单的搜索请求。
func handler(_ result: Result<SearchResponse<Message>, Error>) -> Void {
switch result {
case .failure(let error):
print("Error", error)
case .success(let response):
print("Response", response)
}
}
let queryBuilder = QueryBuilders.boolQuery()
let match = try QueryBuilders.matchQuery().set(field: "msg").set(value: "Message").build()
queryBuilder.must(query: match)
let query = try queryBuilder.build()
let sort = SortBuilders.fieldSort("msg") // use "msg.keyword" as field name in case of text field
.set(order: .asc)
.build()
let request = try SearchRequestBuilder()
.set(indices: "indexName")
.set(types: "type")
.set(query: query)
.add(sort: sort)
.build()
client.search(request, completionHandler: handler)
QueryDSL
下表列出了所有可用的搜索查询及其对应的 QueryBuilder 类名和 QueryBuilders 工具类中的帮助方法名。
搜索查询 | QueryBuilder 类 | QueryBuilder 中的方法 |
---|---|---|
ConstantScoreQuery | ConstantScoreQueryBuilder | QueryBuilders.constantScoreQuery() |
BoolQuery | BoolQueryBuilder | QueryBuilders.boolQuery() |
DisMaxQuery | DisMaxQueryBuilder | QueryBuilders.disMaxQuery() |
FunctionScoreQuery | 函数分值查询构建器 | QueryBuilders.functionScoreQuery() |
提升查询 | 提升查询构建器 | QueryBuilders.boostingeQuery() |
匹配查询 | 匹配查询构建器 | QueryBuilders.matchQuery() |
匹配短语查询 | 匹配短语查询构建器 | QueryBuilders.matchPhraseQuery() |
匹配短语前缀查询 | 匹配短语前缀查询构建器 | QueryBuilders.matchPhrasePrefixQuery() |
多匹配查询 | 多匹配查询构建器 | QueryBuilders.multiMatchQuery() |
公共术语查询 | 公共术语查询构建器 | QueryBuilders.commonTermsQuery() |
查询字符串查询 | 查询字符串查询构建器 | QueryBuilders.queryStringQuery() |
简单查询字符串查询 | 简单查询字符串查询构建器 | QueryBuilders.simpleQueryStringQuery() |
全部匹配查询 | 全部匹配查询构建器 | QueryBuilders.matchAllQuery() |
无匹配查询 | 无匹配查询构建器 | QueryBuilders.matchNoneQuery() |
词查询 | 词查询构建器 | QueryBuilders.termQuery() |
词项查询 | 词项查询构建器 | QueryBuilders.termsQuery() |
范围查询 | 范围查询构建器 | QueryBuilders.rangeQuery() |
存在性查询 | 存在性查询构建器 | QueryBuilders.existsQuery() |
前缀查询 | 前缀查询构建器 | QueryBuilders.prefixQuery() |
通配符查询 | 通配符查询构建器 | QueryBuilders.wildCardQuery() |
正则表达式查询 | 正则表达式查询构建器 | QueryBuilders.regexpQuery() |
模糊查询 | 模糊查询构建器 | QueryBuilders.fuzzyQuery() |
类型查询 | 类型查询构建器 | QueryBuilders.typeQuery() |
IDs查询 | ID构建器 | QueryBuilders.idsQuery() |
嵌套查询 | 嵌套查询构建器 | QueryBuilders.nestedQuery() |
有子查询 | 有子查询构建器 | QueryBuilders.hasChildQuery() |
有父查询 | 有父查询构建器 | QueryBuilders.hasParentQuery() |
父ID查询 | 父ID查询构建器 | QueryBuilders.parentIdQuery() |
地理形状查询 | 地理形状查询构建器 | QueryBuilders.geoShapeQuery() |
地理边界盒查询 | 地理边界盒查询构建器 | QueryBuilders.geoBoundingBoxQuery() |
地理距离查询 | 地理距离查询构建器 | QueryBuilders.geoDistanceQuery() |
地理多边形查询 | 地理多边形查询构建器 | QueryBuilders.geoPolygonQuery() |
更多类似查询 | 更多类似查询构建器 | QueryBuilders.moreLikeThisQuery() |
脚本查询 | 脚本查询构建器 | QueryBuilders.scriptQuery() |
渗漏查询 | 渗漏查询构建器 | QueryBuilders.percolateQuery() |
包装查询 | 包装查询构建器 | QueryBuilders.wrapperQuery() |
跨度词查询 | 跨度词查询构建器 | QueryBuilders.spanTermQuery() |
跨度多词查询 | 跨度多词查询构建器 | QueryBuilders.spanMultiTermQueryBuilder() |
跨度首次出现的查询 | 跨度首次出现的查询构建器 | QueryBuilders.spanFirstQuery() |
跨度相邻查询 | 跨度相邻查询构建器 | QueryBuilders.spanNearQuery() |
跨度或查询 | 跨度或查询构建器 | QueryBuilders.spanOrQuery() |
跨度非查询 | 跨度非查询构建器 | QueryBuilders.spanNotQuery() |
跨度包含查询 | 跨度包含查询构建器 | QueryBuilders.spanContainingQuery() |
跨度在查询 | 跨度在查询构建器 | QueryBuilders.spanWithinQuery() |
跨度字段屏蔽查询构建器 | 跨度字段屏蔽查询构建器 | QueryBuilders.fieldMaskingSpanQuery() |