Golang 操作 ElasticSearch

作者: adm 分类: go 发布时间: 2025-01-26

在 Go 语言中操作 Elasticsearch 通常使用官方提供的 Elasticsearch 客户端库 elastic/go-elasticsearch。这个库提供了与 Elasticsearch 交互的 API,支持索引、搜索、更新、删除等操作。

以下是如何在 Go 中操作 Elasticsearch 的详细步骤和示例代码:

1. 安装 Elasticsearch 客户端库

使用以下命令安装 Elasticsearch 客户端库:

bash

go get github.com/elastic/go-elasticsearch/v8

2. 初始化 Elasticsearch 客户端

在代码中初始化 Elasticsearch 客户端:

go

package main

import (
	"log"
	"github.com/elastic/go-elasticsearch/v8"
)

func main() {
	// 初始化客户端
	cfg := elasticsearch.Config{
		Addresses: []string{
			"http://localhost:9200", // Elasticsearch 地址
		},
	}
	es, err := elasticsearch.NewClient(cfg)
	if err != nil {
		log.Fatalf("Error creating the client: %s", err)
	}

	// 测试连接
	res, err := es.Info()
	if err != nil {
		log.Fatalf("Error getting response: %s", err)
	}
	defer res.Body.Close()
	log.Println(res.String())
}

3. 索引文档

将数据索引到 Elasticsearch 中:

go

func indexDocument(es *elasticsearch.Client) {
	// 文档数据
	doc := `{
		"title": "Go and Elasticsearch",
		"content": "How to use Go with Elasticsearch"
	}`

	// 索引文档
	res, err := es.Index(
		"my_index", // 索引名称
		strings.NewReader(doc), // 文档内容
		es.Index.WithDocumentID("1"), // 文档 ID
		es.Index.WithRefresh("true"), // 刷新索引
	)
	if err != nil {
		log.Fatalf("Error indexing document: %s", err)
	}
	defer res.Body.Close()
	log.Println(res.String())
}

4. 搜索文档

使用查询语句搜索文档:

go

func searchDocument(es *elasticsearch.Client) {
	// 查询语句
	query := `{
		"query": {
			"match": {
				"title": "Go"
			}
		}
	}`

	// 执行搜索
	res, err := es.Search(
		es.Search.WithIndex("my_index"), // 索引名称
		es.Search.WithBody(strings.NewReader(query)), // 查询内容
	)
	if err != nil {
		log.Fatalf("Error searching document: %s", err)
	}
	defer res.Body.Close()
	log.Println(res.String())
}

5. 更新文档

更新已索引的文档:

go

func updateDocument(es *elasticsearch.Client) {
	// 更新内容
	update := `{
		"doc": {
			"content": "Updated content"
		}
	}`

	// 执行更新
	res, err := es.Update(
		"my_index", // 索引名称
		"1", // 文档 ID
		strings.NewReader(update), // 更新内容
	)
	if err != nil {
		log.Fatalf("Error updating document: %s", err)
	}
	defer res.Body.Close()
	log.Println(res.String())
}

6. 删除文档

删除指定文档:

go

func deleteDocument(es *elasticsearch.Client) {
	// 执行删除
	res, err := es.Delete(
		"my_index", // 索引名称
		"1", // 文档 ID
	)
	if err != nil {
		log.Fatalf("Error deleting document: %s", err)
	}
	defer res.Body.Close()
	log.Println(res.String())
}

7. 批量操作

批量索引或删除文档:

go

func bulkOperation(es *elasticsearch.Client) {
	// 批量操作内容
	body := `{ "index" : { "_index" : "my_index", "_id" : "2" } }
{ "title" : "Bulk operation", "content" : "This is a bulk operation" }
{ "delete" : { "_index" : "my_index", "_id" : "1" } }`

	// 执行批量操作
	res, err := es.Bulk(
		strings.NewReader(body), // 批量操作内容
	)
	if err != nil {
		log.Fatalf("Error performing bulk operation: %s", err)
	}
	defer res.Body.Close()
	log.Println(res.String())
}

8. 处理响应

Elasticsearch 的响应通常是 JSON 格式,可以使用 encoding/json 包解析:

go

type SearchResponse struct {
	Hits struct {
		Hits []struct {
			Source map[string]interface{} `json:"_source"`
		} `json:"hits"`
	} `json:"hits"`
}

func parseSearchResponse(res *esapi.Response) {
	var r SearchResponse
	if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
		log.Fatalf("Error parsing the response: %s", err)
	}
	for _, hit := range r.Hits.Hits {
		log.Printf("Document: %v", hit.Source)
	}
}

9. 总结

使用 elastic/go-elasticsearch 库可以方便地在 Go 中操作 Elasticsearch。
支持索引、搜索、更新、删除等常见操作。
通过异步和非阻塞的方式与 Elasticsearch 交互,适合高性能场景。
如果你需要更高级的功能(如聚合、复杂查询等),可以参考 Elasticsearch 官方文档 并结合 Go 客户端库实现。

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!