ElasticSwiftQueryDSL 1.0.0-beta.1

ElasticSwiftQueryDSL 1.0.0-beta.1

Prafull Soni 维护。



 
依赖
ElasticSwiftCodableUtils= 1.0.0-beta.1
ElasticSwiftCore= 1.0.0-beta.1
Logging~> 1.4
 

  • 作者
  • pksprojects

ElasticSwift

Build Status codecov Swift Version SwiftPM Compatible Supported Platforms CocoaPods Compatible

项目状态

本项目目前处于积极开发中,随着项目进展,将提供更多信息。

如果您想贡献,欢迎提交合并请求。

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

下表列出了所有可用的搜索查询以及它们在 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()