ElasticSwift
项目状态
该项目仍在积极开发中,随着项目的进展,将提供更多信息。
如果您想做出贡献,欢迎提交 pull requests。
-
支持平台 macOS、iOS 和 linux。
-
查询 DSL 构建器和辅助工具,类似于 Elasticsearch Java 客户端。查看下表以查看可用的所有 QueryBuilders 列表
项目目标
我们的目标是创建一个非常 Swift 并高性能的 Elasticsearch 客户端。
高性能意味着在 100 毫秒(不包括 Elasticsearch 处理请求的时间)内提供最终用户响应。
安装
CocoaPods
CocoaPods 是 Cocoa 项目的依赖管理器。您可以使用以下命令安装它:
$ gem install cocoapods构建 ElasticSwift 需要 1.6.0+ 的 CocoaPods。
要使用 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 installSwift Package Manager
Swift Package Manager 是一个用于自动化 Swift 代码分发的工具,并集成到了 Swift 编译器中。虽然它目前仍处于早期开发阶段,但 ElasticSwift 在支持平台上支持其使用。
一旦您的 Swift 包设置完成,添加 ElasticSwift 作为依赖项就像将其添加到 Package.swift 的 dependencies 值一样简单。
dependencies: [
.package(url: "https://github.com/pksprojects/ElasticSwift.git", from: "1.0.0-beta.1")
]然后,将适当的 ElasticSwift 模块添加到您的目标依赖项。添加目标依赖项的语法在 Swift 不同版本之间存在细微差别。例如,如果您想依赖 ElasticSwift 和 ElasticSwiftCore 模块,指定以下依赖项:
Swift 5.0 和 5.1 (swift-tools-version:5.[01])
dependencies: ["ElasticSwift", "ElasticSwiftCore"] Swift 5.2 (swift-tools-version: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
下表列出了所有可用搜索查询,及其对应的 QueryBuilder 类名称和 QueryBuilders 工具类中的帮助方法名称。
| 搜索查询 | QueryBuilder 类 | QueryBuilder 中的方法 |
|---|---|---|
| ConstantScoreQuery | ConstantScoreQueryBuilder | QueryBuilders.constantScoreQuery() |
| BoolQuery | BoolQueryBuilder | QueryBuilders.boolQuery() |
| DisMaxQuery | DisMaxQueryBuilder | DisMaxQueryBuilder.queryBuilders.disMaxQuery() |
| FunctionScoreQuery | FunctionScoreQueryBuilder | QueryBuilders.functionScoreQuery() |
| BoostingQuery | BoostingQueryBuilder | QueryBuilders.boostingQuery() |
| MatchQuery | MatchQueryBuilder | QueryBuilders.matchQuery() |
| MatchPhraseQuery | MatchPhraseQueryBuilder | QueryBuilders.matchPhraseQuery() |
| MatchPhrasePrefixQuery | MatchPhrasePrefixQueryBuilder | QueryBuilders.matchPhrasePrefixQuery() |
| MultiMatchQuery | MultiMatchQueryBuilder | QueryBuilders.multiMatchQuery() |
| CommonTermsQuery | CommonTermsQueryBuilder | QueryBuilders.commonTermsQuery() |
| QueryStringQuery | QueryStringQueryBuilder | QueryBuilders.queryStringQuery() |
| SimpleQueryStringQuery | SimpleQueryStringQueryBuilder | QueryBuilders.simpleQueryStringQuery() |
| MatchAllQuery | MatchAllQueryBuilder | QueryBuilders.matchAllQuery() |
| MatchNoneQuery | MatchNoneQueryBuilder | QueryBuilders.matchNoneQuery() |
| TermQuery | TermQueryBuilder | QueryBuilders.termQuery() |
| TermsQuery | TermsQueryBuilder | QueryBuilders.termsQuery() |
| RangeQuery | RangeQueryBuilder | QueryBuilders.rangeQuery() |
| ExistsQuery | ExistsQueryBuilder | QueryBuilders.existsQuery() |
| PrefixQuery | PrefixQueryBuilder | QueryBuilders.prefixQuery() |
| WildCardQuery | WildCardQueryBuilder | QueryBuilders.wildCardQuery() |
| RegexpQuery | RegexpQueryBuilder | QueryBuilders.regexpQuery() |
| FuzzyQuery | FuzzyQueryBuilder | QueryBuilders.fuzzyQuery() |
| TypeQuery | TypeQueryBuilder | QueryBuilders.typeQuery() |
| IdsQuery | IdsQueryBuilder | QueryBuilders.idsQuery() |
| NestedQuery | NestedQueryBuilder | QueryBuilders.nestedQuery() |
| HasChildQuery | HasChildQueryBuilder | QueryBuilders.hasChildQuery() |
| HasParentQuery | HasParentQueryBuilder | QueryBuilders.hasParentQuery() |
| ParentIdQuery | ParentIdQueryBuilder | QueryBuilders.parentIdQuery() |
| GeoShapeQuery | GeoShapeQueryBuilder | QueryBuilders.geoShapeQuery() |
| GeoBoundingBoxQuery | GeoBoundingBoxQueryBuilder | QueryBuilders.geoBoundingBoxQuery() |
| GeoDistanceQuery | GeoDistanceQueryBuilder | QueryBuilders.geoDistanceQuery() |
| GeoPolygonQuery | GeoPolygonQueryBuilder | QueryBuilders.geoPolygonQuery() |
| MoreLikeThisQuery | MoreLikeThisQueryBuilder | QueryBuilders.moreLikeThisQuery() |
| ScriptQuery | ScriptQueryBuilder | QueryBuilders.scriptQuery() |
| PercolateQuery | PercoloteQueryBuilder | QueryBuilders.percolateQuery() |
| WrapperQuery | WrapperQueryBuilder | QueryBuilders.wrapperQuery() |
| SpanTermQuery | SpanTermQueryBuilder | QueryBuilders.spanTermQuery() |
| SpanMultiTermQuery | SpanMultiTermQueryBuilder | QueryBuilders.spanMultiTermQueryBuilder() |
| SpanFirstQuery | SpanFirstQueryBuilder | QueryBuilders.spanFirstQuery() |
| SpanNearQuery | SpanNearQueryBuilder | QueryBuilders.spanNearQuery() |
| SpanOrQuery | SpanOrQueryBuilder | QueryBuilders.spanOrQuery() |
| SpanNotQuery | SpanNotQueryBuilder | QueryBuilders.spanNotQuery() |
| SpanContainingQuery | SpanContainingQueryBuilder | QueryBuilders.spanContainingQuery() |
| SpanWithinQuery | SpanWithinQueryBuilder | QueryBuilders.spanWithinQuery() |
| SpanFieldMaskingQueryBuilder | SpanFieldMaskingQueryBuilder | QueryBuilders.fieldMaskingSpanQuery() |