约定

编辑

本节详细介绍了构建类型化客户端所依据的约定。

结构

编辑

类型化客户端位于 go-elasticsearch 仓库中的 typedapi 包中。

整个客户端在一个索引中汇总在包的根目录,以便在实例化后方便访问。

每个端点都位于 typedapi 中的单独包中,并包含此端点的客户端和 Request 结构(如果适用)。

这些请求基于从 elasticsearch-specification 仓库生成的结构集合,并收集在 typedapi 中的 types 包中。

命名

编辑

在适当的情况下,名称可以以下划线为后缀

  • 为了避免与受保护的关键字(rangeiftype 等)冲突。
  • 为了反映 API 中前导下划线的存在,如 \_indexIndex_\_sourceSource_

端点

编辑

所有可用的端点都生成在单独的包中,并在客户端中组装。 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 联合字段的表达能力,用类型别名表示为接口。