Go 客户端中的 ES|QL编辑

此页面帮助您了解和使用 Go 客户端中的 ES|QL

在 Go 客户端中使用 ES|QL 有两种方法

  • 直接使用 Elasticsearch ES|QL API:这是最灵活的方法,但也是最复杂的方法,因为您必须以原始形式处理结果。您可以选择结果的精确格式,例如 JSON、CSV 或文本。
  • 使用 ES|QL 映射助手:这些映射器负责将原始响应解析为应用程序可以轻松使用的内容。助手可用于对象映射和迭代对象。

如何使用 ES|QL API编辑

ES|QL 查询 API 允许您指定如何返回结果。您可以选择 响应格式,例如 CSV、文本或 JSON,然后使用列分隔符和语言环境等参数对其进行微调。

以下示例获取 ES|QL 结果作为 CSV 并对其进行解析

queryAuthor := `from library
    | where author == "Isaac Asimov"
    | sort release_date desc
    | limit 10`

response, err := client.Esql.Query().
    Query(queryAuthor).
    Format("csv").
    Do(context.Background())
if err != nil {
    log.Fatal(err)
}

reader := csv.NewReader(bytes.NewReader(response))
rows, err := reader.ReadAll()
for _, row := range rows {
    fmt.Println(row)
}

使用 ES|QL 结果编辑

前面的示例表明,虽然原始 ES|QL API 提供了最大的灵活性,但要使用结果数据还需要额外的操作。

为了简化操作,请尝试使用 ES|QL 结果的这两种主要表示形式(每种都有自己的映射助手)

  • 对象,其中结果中的每一行都映射到应用程序域中的一个对象。这类似于 ORM(对象关系映射器)通常执行的操作。
package main

import (
	"context"
	"fmt"
	"log"

	"github.com/elastic/go-elasticsearch/v8"
	"github.com/elastic/go-elasticsearch/v8/typedapi/esql/query"
)

type Book struct {
	Name        string `json:"name"`
	Author      string `json:"author"`
	ReleaseDate string `json:"release_date"`
	PageCount   int    `json:"page_count"`
}

func main() {
	client, err := elasticsearch.NewTypedClient(elasticsearch.Config{Addresses: []string{"ELASTICSEARCH_URL"}})
	if err != nil {
		log.Fatal(err)
	}

	queryAuthor := `from library
        | where author == "Isaac Asimov"
        | sort release_date desc
        | limit 10`

	qry := client.Esql.Query().Query(queryAuthor)
	books, err := query.Helper[Book](context.Background(), qry)
	if err != nil {
		log.Fatal(err)
	}

	for _, book := range books {
		fmt.Println(book)
	}
}
  • 迭代对象,其中结果中的每一行都映射到应用程序域中的一个对象,一次一个。
queryAuthor := `from library
    | where author == "Isaac Asimov"
    | sort release_date desc
    | limit 10`

qry := client.Esql.Query().Query(queryAuthor)
books, err := query.NewIteratorHelper[Book](context.Background(), qry)
if err != nil {
    log.Fatal(err)
}

for books.More() {
    book, err := books.Next()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(book)
}