在 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 客户端库即可。