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 install
Swift 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-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
下表列出了所有可用搜索查询,及其对应的 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() |