约定
本节详细介绍了类型化客户端的构建约定。
类型化客户端位于 go-elasticsearch 存储库中的 typedapi 包内。
整个客户端在包的根目录中进行了索引汇总,以便实例化后方便访问。
每个端点都位于 typedapi 内自己的包中,包含该端点的客户端以及(如果适用)Request 结构。
请求基于从 elasticsearch-specification 存储库生成并汇总在 typedapi 内的 types 包中的一组结构。
在适当的时候,名称可能会以 `_` 作为后缀
- 以避免与受保护的关键字(
range、if、type等)发生冲突。 - 以反映 API 中存在前导下划线,例如
\_indexvsIndex_或\_sourcevsSource_。
所有可用的端点都在单独的包中生成并汇集到客户端中。core 命名空间在客户端根目录处重复,以便于访问。
每个端点都遵循工厂模式,每次都返回一个指向新实例的指针。
res, err := es.Search().Index("index_name").AllowPartialSearchResults(true).Do(context.Background())
如果所使用的特定端点需要参数,这些参数将作为与 API 相同的顺序的参数存在。
es.Create("index_name", "doc_id").Do(context.Background())
否则,您可以在构建器中找到它们。
es.Search().Index("index_name").Do(context.Background())
或者,每个端点都可以直接从其包中实例化。
transport, err := elastictransport.New(elastictransport.Config{})
res, err = search.New(transport).Do(context.Background())
Do 方法接受一个可选的 context,通过传输运行请求,并返回结果以及错误。
对于空体的端点,例如 core.Exists,还有一个附加方法 IsSuccess。与 Do 方法一样,它接受一个可选的 context,在需要时耗尽并关闭正文,并返回一个布尔值和一个错误。
if exists, err := es.Core.Exists("index_name", "doc_id").IsSuccess(context.Background()); exists {
// The document exists!
} else if err != nil {
// An error occurred.
}
请求围绕尽可能贴近 Elasticsearch API 的结构进行建模,并使用标准的 json/encoding 进行序列化。相应的请求可以在其端点所在的同一个包中找到,并附带一个构建器,允许您通过遵循类型来深入了解 API。
types.Query{
Term: map[string]types.TermQuery{
"name": {Value: "Foo"},
},
}
虽然不是初始发布的一部分,但响应将在稍后添加。
请求和响应依赖于从 types 包中的 elasticsearch-specification 生成的一组结构。每个类型都带有 json 标签。
Elasticsearch API 有多个枚举实例,每个实例都在 types/enums 中的一个包内。枚举被声明为一种类型,枚举的每个成员都是一个带有其值的导出变量。枚举类型序列化为相关的 API 值,例如可以在搜索 API 中找到的 refresh 选项。
refresh.True => "true"
refresh.False => "false"
refresh.Waitfor => "wait_for"
为了捕捉 API 的表达能力,联合字段表示为接口的类型别名。