ElasticSwift
项目状态
本项目目前处于积极开发中,随着项目进展,将提供更多信息。
如果您想贡献,欢迎提交合并请求。
-
支持 macOS、iOS & Linux 平台。
-
类似于 Elasticsearch Java 客户端的 Query DSL 构建器和辅助工具。请查看下表以获取所有可用的 QueryBuilders 列表。
项目目标
我们的目标是创建一个非常 Swift 和高性能的 elasticsearch 客户端。
高性能意味着提供低于 100ms 的最终用户响应,不包括 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 install
Swift Package Manager
Swift Package Manager 是一个用于自动化 Swift 代码分发的工具,集成到 Swift 编译器中。它处于早期开发阶段,但 ElasticSwift 支持在支持的平台上使用它。
在设置完您的 Swift 包之后,将 ElasticSwift 添加为依赖项就像将其添加到 Package.swift 的依赖项值一样简单。
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")]
使用方法
客户端
创建 Settings
和 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 都可用。未来的版本将添加对更多 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
下表列出了所有可用的搜索查询以及它们在 QueryBuilders 工具类中对应的 QueryBuilder 类名称和辅助方法名称。
搜索查询 | QueryBuilder 类 | QueryBuilder 中的方法 |
---|---|---|
ConstantScoreQuery | 常量评分查询构建器 | QueryBuilders.constantScoreQuery() |
布尔查询 | 布尔查询构建器 | QueryBuilders.boolQuery() |
DisMax查询 | DisMax查询构建器 | QueryBuilders.disMaxQuery() |
函数评分查询 | 函数评分查询构建器 | QueryBuilders.functionScoreQuery() |
提升查询 | 提升查询构建器 | QueryBuilders.boostingQuery() |
匹配查询 | 匹配查询构建器 | 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查询 | Ids查询构建器 | 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() |