返回

Go 客户端之 Elasticsearch 入门

后端

Elasticsearch Go 客户端:一个快速入门指南

连接到 Elasticsearch

使用 Elasticsearch Go 客户端的旅程始于与 Elasticsearch 集群建立连接。这可以通过 elasticsearch.NewClient 函数来实现,它接受一个 elasticsearch.Config 结构作为参数,其中包含有关集群地址、认证凭据和配置设置的信息。

import (
	"context"
	"fmt"
	"log"
	"time"

	"github.com/elastic/go-elasticsearch/v8"
)

func main() {
	cfg := elasticsearch.Config{
		Addresses: []string{"http://localhost:9200"},
	}
	client, err := elasticsearch.NewClient(cfg)
	if err != nil {
		log.Fatalf("Error creating client: %s", err)
	}

	defer client.Close()

	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()

	res, err := client.Info(ctx)
	if err != nil {
		log.Fatalf("Error getting info: %s", err)
	}

	fmt.Println(res)
}

管理索引

索引是 Elasticsearch 中存储和组织文档的基本单位。使用 Go 客户端,您可以创建、删除、获取和更新索引。

func main() {
	cfg := elasticsearch.Config{
		Addresses: []string{"http://localhost:9200"},
	}
	client, err := elasticsearch.NewClient(cfg)
	if err != nil {
		log.Fatalf("Error creating client: %s", err)
	}

	defer client.Close()

	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()

	idx := elasticsearch.NewIndex("my-index")
	res, err := client.CreateIndex(ctx, idx)
	if err != nil {
		log.Fatalf("Error creating index: %s", err)
	}

	fmt.Println(res)
}

索引文档

文档是 Elasticsearch 中存储数据的单元。Go 客户端使您可以轻松地索引文档,并通过指定索引和类型对其进行分类。

func main() {
	cfg := elasticsearch.Config{
		Addresses: []string{"http://localhost:9200"},
	}
	client, err := elasticsearch.NewClient(cfg)
	if err != nil {
		log.Fatalf("Error creating client: %s", err)
	}

	defer client.Close()

	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()

	doc := elasticsearch.NewDocument("my-doc")
	doc.Index("my-index")
	doc.Type("my-type")
	doc.BodyJson(map[string]interface{}{
		"name": "John Doe",
		"age":  30,
	})

	res, err := client.Index(ctx, doc)
	if err != nil {
		log.Fatalf("Error indexing document: %s", err)
	}

	fmt.Println(res)
}

搜索文档

使用 Elasticsearch Go 客户端,您可以根据各种查询条件搜索文档。例如,您可以使用布尔查询、范围查询或聚合查询。

func main() {
	cfg := elasticsearch.Config{
		Addresses: []string{"http://localhost:9200"},
	}
	client, err := elasticsearch.NewClient(cfg)
	if err != nil {
		log.Fatalf("Error creating client: %s", err)
	}

	defer client.Close()

	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()

	query := elasticsearch.NewMatchQuery("name", "John Doe")
	res, err := client.Search(ctx,
		client.Search.WithIndex("my-index"),
		client.Search.WithQuery(query),
	)
	if err != nil {
		log.Fatalf("Error searching documents: %s", err)
	}

	fmt.Println(res)
}

聚合结果

聚合是 Elasticsearch 的一项强大功能,它允许您从搜索结果中汇总和分析数据。Go 客户端提供了对各种聚合类型的支持,例如计数聚合、最大值聚合和平均值聚合。

func main() {
	cfg := elasticsearch.Config{
		Addresses: []string{"http://localhost:9200"},
	}
	client, err := elasticsearch.NewClient(cfg)
	if err != nil {
		log.Fatalf("Error creating client: %s", err)
	}

	defer client.Close()

	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()

	agg := elasticsearch.NewTermsAggregation("age_groups").Field("age")
	res, err := client.Search(ctx,
		client.Search.WithIndex("my-index"),
		client.Search.WithAggregation("age_groups", agg),
	)
	if err != nil {
		log.Fatalf("Error searching documents: %s", err)
	}

	fmt.Println(res)
}

处理错误

与任何分布式系统一样,在使用 Elasticsearch Go 客户端时可能会遇到错误。该客户端提供了丰富的错误处理功能,包括重试和发现机制。

func main() {
	cfg := elasticsearch.Config{
		Addresses: []string{"http://localhost:9200"},
		// Enable retries with a backoff strategy
		RetryOnConflict: true,
		RetryBackoff:    true,
	}
	client, err := elasticsearch.NewClient(cfg)
	if err != nil {
		log.Fatalf("Error creating client: %s", err)
	}

	defer client.Close()

	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()

	// Perform an operation that may fail due to a conflict
	_, err = client.Index(ctx, elasticsearch.NewDocument("my-doc"))
	if err != nil {
		log.Printf("Error indexing document: %s", err)
	}
}

结论

Elasticsearch Go 客户端是一个功能强大的工具包,用于与 Elasticsearch 集群交互。它提供了丰富的 API 和功能,使您可以轻松地管理索引、文档、查询和聚合。通过了解本文中介绍的概念,您可以充分利用 Go 客户端的强大功能,并有效地使用 Elasticsearch。

常见问题解答

  1. 如何安装 Elasticsearch Go 客户端?

    go get -u github.com/elastic/go-elasticsearch
    
  2. 我如何连接到远程 Elasticsearch 集群?

    cfg := elasticsearch.Config{
        Addresses: []string{"http://remote-host:9200"},
    }
    client, err := elasticsearch.NewClient(cfg)
    
  3. 如何索引具有自定义 ID 的文档?

    doc := elasticsearch.NewDocumentWithId("my-doc", "123")
    doc.Index("my-index")
    
  4. 我如何使用过滤器在搜索结果中排除某些文档?

    query := elasticsearch.NewBoolQuery()
    query.MustNot(elasticsearch.NewMatchQuery("field", "value"))
    
  5. 如何从搜索结果中获取特定字段的值?

    res, err := client.Search(ctx,
        client.Search.WithIndex("my-index"),
        client.Search.WithSource(true),
    )