Golang使用Elasticsearch

语言: CN / TW / HK

创建es.go文件

根据elasticsearch版本拉取对应的go包: github.com/elastic/go-elasticsearch

API文档: https://pkg.go.dev/github.com/elastic/go-elasticsearch/v6@v6.8.5/esapi?tab=doc

package es

import (
    "bytes"
    "context"
    "encoding/json"
    "fmt"
    "github.com/elastic/go-elasticsearch/v6"
    "log"
)

func failOnError(err error, msg string) {
    if err != nil {
        log.Fatalf("%s: %s", msg, err)
    }
}

Index 在索引中创建或更新文档

索引不存在的情况下,会自动创建索引。

默认的_type(类型)是_doc,下面是指定doc类型创建添加的。

func Index() {
    addresses := []string{"http://127.0.0.1:9200", "http://127.0.0.1:9201"}
    config := elasticsearch.Config{
        Addresses:             addresses,
        Username:              "",
        Password:              "",
        CloudID:               "",
        APIKey:                "",
    }
    // new client
    es, err := elasticsearch.NewClient(config)
    failOnError(err, "Error creating the client")
    // Index creates or updates a document in an index
    var buf bytes.Buffer
    doc := map[string]interface{}{
        "title": "你看到外面的世界是什么样的?",
        "content": "外面的世界真的很精彩",
    }
    if err := json.NewEncoder(&buf).Encode(doc); err != nil {
        failOnError(err, "Error encoding doc")
    }
    res, err := es.Index("demo", &buf, es.Index.WithDocumentType("doc"))
    if err != nil {
        failOnError(err, "Error Index response")
    }
    defer res.Body.Close()
    fmt.Println(res.String())
}

Search 搜索

func Search() {
    addresses := []string{"http://127.0.0.1:9200", "http://127.0.0.1:9201"}
    config := elasticsearch.Config{
        Addresses:             addresses,
        Username:              "",
        Password:              "",
        CloudID:               "",
        APIKey:                "",
    }
    // new client
    es, err := elasticsearch.NewClient(config)
    failOnError(err, "Error creating the client")
    // info
    res, err := es.Info()
    failOnError(err, "Error getting response")
    fmt.Println(res.String())
    // search - highlight
    var buf bytes.Buffer
    query := map[string]interface{}{
        "query": map[string]interface{}{
            "match": map[string]interface{}{
                "title": "中国",
            },
        },
        "highlight": map[string]interface{}{
            "pre_tags" : []string{"<font color='red'>"},
            "post_tags" : []string{"</font>"},
            "fields" : map[string]interface{}{
                "title" : map[string]interface{}{},
            },
        },
    }
    if err := json.NewEncoder(&buf).Encode(query); err != nil {
        failOnError(err, "Error encoding query")
    }
    // Perform the search request.
    res, err = es.Search(
        es.Search.WithContext(context.Background()),
        es.Search.WithIndex("demo"),
        es.Search.WithBody(&buf),
        es.Search.WithTrackTotalHits(true),
        es.Search.WithPretty(),
    )
    if err != nil {
        failOnError(err, "Error getting response")
    }
    defer res.Body.Close()
    fmt.Println(res.String())
}

DeleteByQuery 通过匹配条件删除文档

func DeleteByQuery() {
    addresses := []string{"http://127.0.0.1:9200", "http://127.0.0.1:9201"}
    config := elasticsearch.Config{
        Addresses:             addresses,
        Username:              "",
        Password:              "",
        CloudID:               "",
        APIKey:                "",
    }
    // new client
    es, err := elasticsearch.NewClient(config)
    failOnError(err, "Error creating the client")
    // DeleteByQuery deletes documents matching the provided query
    var buf bytes.Buffer
    query := map[string]interface{}{
        "query": map[string]interface{}{
            "match": map[string]interface{}{
                "title": "外面",
            },
        },
    }
    if err := json.NewEncoder(&buf).Encode(query); err != nil {
        failOnError(err, "Error encoding query")
    }
    index := []string{"demo"}
    res, err := es.DeleteByQuery(index, &buf)
    if err != nil {
        failOnError(err, "Error delete by query response")
    }
    defer res.Body.Close()
    fmt.Println(res.String())
}

Delete通过_id删除文档

func Delete() {
    addresses := []string{"http://127.0.0.1:9200", "http://127.0.0.1:9201"}
    config := elasticsearch.Config{
        Addresses:             addresses,
        Username:              "",
        Password:              "",
        CloudID:               "",
        APIKey:                "",
    }
    // new client
    es, err := elasticsearch.NewClient(config)
    failOnError(err, "Error creating the client")
    // Delete removes a document from the index
    res, err := es.Delete("demo", "POcKSHIBX-ZyL96-ywQO")
    if err != nil {
        failOnError(err, "Error delete by id response")
    }
    defer res.Body.Close()
    fmt.Println(res.String())
}

Create 添加文档(需要指定_id,_id已存在返回409)

func Create() {
    addresses := []string{"http://127.0.0.1:9200", "http://127.0.0.1:9201"}
    config := elasticsearch.Config{
        Addresses:             addresses,
        Username:              "",
        Password:              "",
        CloudID:               "",
        APIKey:                "",
    }
    // new client
    es, err := elasticsearch.NewClient(config)
    failOnError(err, "Error creating the client")
    // Create creates a new document in the index.
    // Returns a 409 response when a document with a same ID already exists in the index.
    var buf bytes.Buffer
    doc := map[string]interface{}{
        "title": "你看到外面的世界是什么样的?",
        "content": "外面的世界真的很精彩",
    }
    if err := json.NewEncoder(&buf).Encode(doc); err != nil {
        failOnError(err, "Error encoding doc")
    }
    res, err := es.Create("demo", "esd", &buf, es.Create.WithDocumentType("doc"))
    if err != nil {
        failOnError(err, "Error create response")
    }
    defer res.Body.Close()
    fmt.Println(res.String())
}

Get 通过id获取文档

func Get() {
    addresses := []string{"http://127.0.0.1:9200", "http://127.0.0.1:9201"}
    config := elasticsearch.Config{
        Addresses:             addresses,
        Username:              "",
        Password:              "",
        CloudID:               "",
        APIKey:                "",
    }
    // new client
    es, err := elasticsearch.NewClient(config)
    failOnError(err, "Error creating the client")
    res, err := es.Get("demo", "esd")
    if err != nil {
        failOnError(err, "Error get response")
    }
    defer res.Body.Close()
    fmt.Println(res.String())
}

Update 通过_id更新文档

func Update() {
    addresses := []string{"http://127.0.0.1:9200", "http://127.0.0.1:9201"}
    config := elasticsearch.Config{
        Addresses:             addresses,
        Username:              "",
        Password:              "",
        CloudID:               "",
        APIKey:                "",
    }
    // new client
    es, err := elasticsearch.NewClient(config)
    failOnError(err, "Error creating the client")
    // Update updates a document with a script or partial document.
    var buf bytes.Buffer
    doc := map[string]interface{}{
        "doc": map[string]interface{}{
            "title": "更新你看到外面的世界是什么样的?",
            "content": "更新外面的世界真的很精彩",
        },
    }
    if err := json.NewEncoder(&buf).Encode(doc); err != nil {
        failOnError(err, "Error encoding doc")
    }
    res, err := es.Update("demo", "esd", &buf, es.Update.WithDocumentType("doc"))
    if err != nil {
        failOnError(err, "Error Update response")
    }
    defer res.Body.Close()
    fmt.Println(res.String())
}

UpdateByQuery 通过匹配条件更新文档

func UpdateByQuery() {
    addresses := []string{"http://127.0.0.1:9200", "http://127.0.0.1:9201"}
    config := elasticsearch.Config{
        Addresses:             addresses,
        Username:              "",
        Password:              "",
        CloudID:               "",
        APIKey:                "",
    }
    // new client
    es, err := elasticsearch.NewClient(config)
    failOnError(err, "Error creating the client")
    // UpdateByQuery performs an update on every document in the index without changing the source,
    // for example to pick up a mapping change.
    index := []string{"demo"}
    var buf bytes.Buffer
    doc := map[string]interface{}{
        "query": map[string]interface{}{
            "match": map[string]interface{}{
                "title": "外面",
            },
        },
        // 根据搜索条件更新title
        /*
        "script": map[string]interface{}{
            "source": "ctx._source['title']='更新你看到外面的世界是什么样的?'",
        },
         */
        // 根据搜索条件更新title、content
        /*
        "script": map[string]interface{}{
            "source": "ctx._source=params",
            "params": map[string]interface{}{
                "title": "外面的世界真的很精彩",
                "content": "你看到外面的世界是什么样的?",
            },
            "lang": "painless",
        },
         */
        // 根据搜索条件更新title、content
        "script": map[string]interface{}{
            "source": "ctx._source.title=params.title;ctx._source.content=params.content;",
            "params": map[string]interface{}{
                "title": "看看外面的世界真的很精彩",
                "content": "他们和你看到外面的世界是什么样的?",
            },
            "lang": "painless",
        },
    }
    if err := json.NewEncoder(&buf).Encode(doc); err != nil {
        failOnError(err, "Error encoding doc")
    }
    res, err := es.UpdateByQuery(
        index,
        es.UpdateByQuery.WithDocumentType("doc"),
        es.UpdateByQuery.WithBody(&buf),
        es.UpdateByQuery.WithContext(context.Background()),
        es.UpdateByQuery.WithPretty(),
        )
    if err != nil {
        failOnError(err, "Error Update response")
    }
    defer res.Body.Close()
    fmt.Println(res.String())
}

欢迎关注我们的微信公众号,每天学习Go知识

分享到: