ZBLOG

golang es 索引操作以及文档操作

在 Go 中,可以使用 Elasticsearch 官方提供的 Go 客户端库(github.com/elastic/go-elasticsearch)来进行索引操作和文档操作。该客户端库提供了许多方法和结构体,以便于与 Elasticsearch 交互。

以下是一个示例代码,用于对 ES 索引进行创建、删除、更新以及文档的增删改查:

package main

import (
    "context"
    "encoding/json"
    "fmt"
    "log"

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

func main() {
    // 创建一个 Elasticsearch 客户端
    es, err := elasticsearch.NewDefaultClient()
    if err != nil {
        log.Fatalf("Error creating the client: %s", err)
    }

    // 创建索引
    createIndex(es)

    // 添加文档
    addDocument(es)

    // 获取文档
    getDocument(es)

    // 更新文档
    updateDocument(es)

  	// 删除文档
  	deleteDocument(es)
  	
  	// 删除索引
  	deleteIndex(es)
}

func createIndex(es *elasticsearch.Client) {
	// 准备请求参数
	reqBody := `{
		"settings": {
			"number_of_shards": 1,
			"number_of_replicas": 0
		},
		"mappings": {
			"properties": {
				"title": { "type": "text" },
				"content": { "type": "text" }
			}
		}
   }`

   // 发送请求创建索引
   res, err := es.Indices.Create("my_index",
      es.Indices.Create.WithContext(context.Background()),
      es.Indices.Create.WithBody(strings.NewReader(reqBody)),
   )
   if err != nil {
      log.Fatalf("Error creating the index: %s", err)
   }
   
   // 获取响应中的状态码
   statusCode := res.StatusCode
   fmt.Printf("Index created, status code: %d\n", statusCode)
}

func addDocument(es *elasticsearch.Client) {
    // 准备文档数据
    docData := map[string]interface{}{
        "title":   "First document",
        "content": "This is the first document.",
    }

    // 发送请求添加文档
    res, err := es.Index(
        "my_index",
        es.Index.WithDocumentID("1"),                   // 指定文档 ID
        es.Index.WithBodyJSON(docData),                 // 指定文档内容
        es.Index.WithRefresh("true"),                    // 立即刷新索引以使文档可用于搜索(仅用于测试)
        es.Index.WithContext(context.Background()),
    )
    if err != nil {
        log.Fatalf("Error adding document: %s", err)
    }

    // 获取响应中的状态码和 ID
    statusCode := res.StatusCode
    id := res.Id

    fmt.Printf("Document added, status code: %d, id: %s\n", statusCode, id)
}

func getDocument(es *elasticsearch.Client) {
	// 发送请求获取指定 ID 的文档
	res, err := es.Get(
		"my_index",
		"1",
		es.Get.WithContext(context.Background()),
	)
	if err != nil {
	   log.Fatalf("Error getting document: %s", err)
	}
	defer res.Body.Close()
	
	// 解析响应中的文档内容
	var docData map[string]interface{}
	if err := json.NewDecoder(res.Body).Decode(&docData); err != nil {
	   log.Fatalf("Error parsing the response body: %s", err)
	}
	
	fmt.Printf("Document found, title: %s, content: %s\n", docData["title"], docData["content"])
}

func updateDocument(es *elasticsearch.Client) {
    // 准备更新数据
    updateData := map[string]interface{}{
        "doc": map[string]interface{}{
            "content": "This is an updated document.",
        },
    }

    // 发送请求更新文档
    res, err := es.Update(
        "my_index",
        "1",
        es.Update.WithBodyJSON(updateData),
        es.Update.WithRefresh("true"),
        es.Update.WithContext(context.Background()),
    )
    if err != nil {
        log.Fatalf("Error updating document: %s", err)
    }

    // 获取响应中的状态码和 ID
    statusCode := res.StatusCode
    id := res.Id

    fmt.Printf("Document updated, status code: %d, id: %s\n", statusCode, id)
}

func deleteDocument(es *elasticsearch.Client) {
	// 发送请求删除指定 ID 的文档
	res, err := es.Delete(
		"my_index",
		"1",
		es.Delete.WithRefresh("true"),
	    es.Delete.WithContext(context.Background()),
	)
	if err != nil {
	   log.Fatalf("Error deleting document: %s", err)
	}
	
	// 获取响应中的状态码和 ID
	statusCode := res.StatusCode
	id := res.Id
	
	fmt.Printf("Document deleted, status code: %d, id: %s\n", statusCode, id)
}

func deleteIndex(es *elasticsearch.Client) {
	// 发送请求删除索引
	res, err := es.Indices.Delete(
		[]string{"my_index"},
	    es.Indices.Delete.WithIgnoreUnavailable(true), // 如果索引不存在,则忽略错误
	    es.Indices.Delete.WithContext(context.Background()),
	)
	if err != nil {
	   log.Fatalf("Error deleting index: %s", err)
	}
	
	// 获取响应中的状态码和索引名称
	statusCode := res.StatusCode
	indexName := res.Index

	fmt.Printf("Index deleted, status code: %d, index name: %s\n", statusCode, indexName)
}

在上面的代码中,我们首先创建了一个默认配置的 Elasticsearch 客户端(elasticsearch.NewDefaultClient())。然后,我们分别实现了创建索引、添加文档、获取文档、更新文档以及删除文档和删除索引等操作。

需要注意的是,在执行这些操作时,可以使用不同的选项来定制请求参数,以满足不同的需求。例如:

  • WithDocumentID():指定文档 ID。
  • WithBodyJSON():指定请求体中包含的 JSON 数据。
  • WithRefresh():控制何时使文档可用于搜索(仅用于测试)。
  • WithIgnoreUnavailable():如果索引不存在,则忽略错误。

总之,在 Go 中进行 ES 索引操作和文档操作非常简单,只需使用 Elasticsearch 官方提供的 Go 客户端库即可。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=6770

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?