ElasticSwiftCodableUtils 1.0.0-beta.1

ElasticSwiftCodableUtils 1.0.0-beta.1

Prafull Soni 维护。



  • pksprojects

ElasticSwift

Build Status codecov Swift Version SwiftPM Compatible Supported Platforms CocoaPods Compatible

项目状态

该项目仍在积极开发中,随着项目的进展,将提供更多信息。

如果您想做出贡献,欢迎提交 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 不同版本之间存在细微差别。例如,如果您想依赖 ElasticSwiftElasticSwiftCore 模块,指定以下依赖项:

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")]

使用

客户端

创建 SettingsElasticClient

使用 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()