ElasticSwiftCore 1.0.0-beta.1

ElasticSwiftCore 1.0.0-beta.1

Prafull Soni 维护。



 
依赖
SwiftNIO~> 2.22
SwiftNIOHTTP1~> 2.22
Logging~> 1.4
 

ElasticSwiftCore 1.0.0-beta.1

  • 作者:
  • pksprojects

ElasticSwift

Build Status codecov Swift Version SwiftPM Compatible Supported Platforms CocoaPods Compatible

项目状态

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

如果您想贡献,欢迎提交拉取请求。

  • 支持 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 中略有不同。例如,如果您想依赖 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")]

用法

客户端

创建 设置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()