约定
编辑约定
编辑本节详细介绍了构建类型化客户端所依据的约定。
结构
编辑类型化客户端位于 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 联合字段的表达能力,用类型别名表示为接口。