约定编辑

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

结构编辑

类型化客户端位于 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-specificationtypes 包中生成的结构集合。每个类型都带有 json 标签。

枚举编辑

Elasticsearch API 有几个枚举实例,每个实例在 types/enums 中都有一个包。枚举被声明为一个类型,枚举的每个成员都是一个带有其值的导出变量。枚举类型序列化为相关的 API 值,例如可以在 Search API 中找到的 refresh 选项

refresh.True => "true"
refresh.False => "false"
refresh.Waitfor => "wait_for"

联合编辑

为了捕捉 API 的表现力,联合字段由一个指向接口的类型别名表示。