约定
编辑约定编辑
本节详细介绍了类型化客户端的构建约定。
结构编辑
类型化客户端位于 go-elasticsearch
存储库中的 typedapi
包中。
整个客户端在包的根目录下进行索引,以便在实例化后方便访问。
每个端点都位于 typedapi
中的自己的包中,并包含该端点的客户端以及 Request
结构体(如果适用)。
请求基于从 elasticsearch-specification 存储库生成的结构集合,并收集在 typedapi
中的 types
包中。
命名编辑
在适当的情况下,名称可能以下划线结尾
- 为了避免与受保护的关键字(
range
、if
、type
等)冲突。 - 为了反映 API 中前导下划线的出现,例如
\_index
与Index_
或\_source
与Source_
。
端点编辑
所有可用的端点都在单独的包中生成,并在客户端中组装。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"}, }, }
响应编辑
虽然不是初始版本的一部分,但响应将在稍后添加。
类型编辑
请求和响应依赖于从 elasticsearch-specification 在 types
包中生成的结构集合。每个类型都带有 json 标签。
枚举编辑
Elasticsearch API 有几个枚举实例,每个实例在 types/enums
中都有一个包。枚举被声明为一个类型,枚举的每个成员都是一个带有其值的导出变量。枚举类型序列化为相关的 API 值,例如可以在 Search API 中找到的 refresh
选项
refresh.True => "true" refresh.False => "false" refresh.Waitfor => "wait_for"
联合编辑
为了捕捉 API 的表现力,联合字段由一个指向接口的类型别名表示。