项目地址

https://github.com/olivere/elastic

原生API用法

参见:elasticsearch6.4.3 常用API

示例代码

    package main

    import (
        "context"
        "encoding/json"
        "fmt"
        "github.com/olivere/elastic/v6"
        "reflect"
        "strconv"
    )

    type People struct {
        Name     string `json:"name"`
        Age      int    `json:"age"`
        Birthday string `json:"birthday"`
        Desc     string `json:"desc"`
    }

    const mapping = `
    {
        "mappings": {
            "my-type": {
                "properties": {
                    "name": {
                        "type": "keyword"
                    },
                    "age": {
                        "type": "integer"
                    },
                    "birthday": {
                        "type": "date"
                    },
                    "desc": {
                        "type": "text",
                        "analyzer": "ik_max_word",
                        "search_analyzer": "ik_max_word"
                    }
                }
            }
        }
    }
    `

    const (
        Url   = "http://10.0.0.12:9200"
        Index = "my-index"
        Type  = "my-type"
    )

    func main() {
        ctx := context.Background()

        client, err := elastic.NewClient(
            elastic.SetURL(Url),
        )
        if err != nil {
            panic(err)
        }

        defer client.Stop()

        /// 索引相关
        // 创建索引
        createIndexResp, err := client.
            CreateIndex(Index).
            BodyString(mapping).
            Do(ctx)
        if err != nil {
            panic(err)
        }
        fmt.Println(createIndexResp)
        // 删除索引
        deleteIndexResp, err := client.
            DeleteIndex(Index).
            Do(ctx)
        if err != nil {
            panic(err)
        }
        fmt.Println(deleteIndexResp)
        // 获取索引列表
        catIndicesResp, err := client.
            CatIndices().
            Do(ctx)
        if err != nil {
            panic(err)
        }
        for _, item := range catIndicesResp {
            fmt.Println(item.Index)
        }

        /// 文档操作相关(增删改)
        // 创建文档
        data := People{
            Name:     "011",
            Age:      25,
            Birthday: "2000-01-01",
            Desc:     "我的名字叫011,我今年23岁了。我出生于2000年1月1日。谢谢大家!",
        }
        createDocumentResp, err := client.Index().
            Index(Index).
            Type(Type).
            Id("11").
            BodyJson(data).
            Do(ctx)
        if err != nil {
            panic(err)
        }
        fmt.Println(createDocumentResp)
        // 批量创建文档
        docList := []People{
            {"001", 33, "1990-01-01", "我的名字叫001,我今年33岁了。我出生于1990年1月1日。谢谢大家!"},
            {"002", 32, "1991-01-01", "我的名字叫002,我今年32岁了。我出生于1991年1月1日。谢谢大家!"},
            {"003", 31, "1992-01-01", "我的名字叫003,我今年31岁了。我出生于1992年1月1日。谢谢大家!"},
            {"004", 30, "1993-01-01", "我的名字叫004,我今年30岁了。我出生于1993年1月1日。谢谢大家!"},
            {"005", 29, "1994-01-01", "我的名字叫005,我今年29岁了。我出生于1994年1月1日。谢谢大家!"},
            {"006", 28, "1995-01-01", "我的名字叫006,我今年28岁了。我出生于1995年1月1日。谢谢大家!"},
            {"007", 27, "1996-01-01", "我的名字叫007,我今年27岁了。我出生于1996年1月1日。谢谢大家!"},
            {"008", 26, "1997-01-01", "我的名字叫008,我今年26岁了。我出生于1997年1月1日。谢谢大家!"},
            {"009", 25, "1998-01-01", "我的名字叫009,我今年25岁了。我出生于1998年1月1日。谢谢大家!"},
            {"010", 24, "1999-01-01", "我的名字叫010,我今年24岁了。我出生于1999年1月1日。谢谢大家!"},
        }
        bulkRequest := client.Bulk()
        for k, v := range docList {
            id := k + 1
            idStr := strconv.Itoa(id)
            doc := elastic.
                NewBulkIndexRequest().
                Index(Index).
                Type(Type).
                Id(idStr).
                Doc(v)
            bulkRequest = bulkRequest.Add(doc)
        }
        bulkResp, err := bulkRequest.Do(ctx)
        if err != nil {
            panic(err)
        }
        fmt.Println(bulkResp)
        // 根据ID删除文档
        deleteDocumentResp, err := client.
            Delete().
            Index(Index).
            Type(Type).
            Id("1").
            Do(ctx)
        if err != nil {
            panic(err)
        }
        fmt.Println(deleteDocumentResp)
        // 根据条件删除文档
        deleteByQueryResp, err := client.
            DeleteByQuery(Index).
            Type(Type).
            Query(elastic.NewMatchQuery("age", 23)).
            Do(ctx)
        if err != nil {
            panic(err)
        }
        fmt.Println(deleteByQueryResp)
        // 根据ID更新文档
        updateDocumentResp, err := client.
            Update().
            Index(Index).
            Type(Type).
            Id("1").
            Doc(map[string]interface{}{
                "name":     "1",
                "age":      0,
                "birthday": "1990-01-01",
                "desc":     "这是一条测试数据",
            }).
            Do(ctx)
        if err != nil {
            panic(err)
        }
        fmt.Println(updateDocumentResp)
        // 根据条件更新文档
        updateByQueryResp, err := client.
            UpdateByQuery(Index).
            Type(Type).
            Query(elastic.NewMatchQuery("age", 24)).
            Script(elastic.NewScript("ctx._source.age=2;ctx._source.desc+=\"增加描述\"")).
            Do(ctx)
        if err != nil {
            panic(err)
        }
        fmt.Println(updateByQueryResp)
        // 根据ID更新文档中的字段
        updateDocumentFieldResp, err := client.
            Update().
            Index(Index).
            Type(Type).
            Id("1").
            Doc(map[string]interface{}{
                "age": 1,
            }).
            Do(ctx)
        if err != nil {
            panic(err)
        }
        fmt.Println(updateDocumentFieldResp)

        /// 文档查询相关(支持查询指定字段、分页、排序)
        var people People
        // 获取所有文档
        searchAllResp, err := client.
            Search(Index).
            Query(elastic.NewMatchAllQuery()).
            FetchSourceContext(elastic.NewFetchSourceContext(true).Include("name", "age")).
            Sort("age", true).
            From(0).
            Size(2).
            Do(ctx)
        if err != nil {
            panic(err)
        }
        for _, value := range searchAllResp.Each(reflect.TypeOf(people)) {
            if t, ok := value.(People); ok {
                fmt.Println(t)
            }
        }
        // 根据ID获取文档
        getByIdResp, err := client.
            Get().
            Index(Index).
            Type(Type).
            Id("5").
            FetchSource(true).
            Do(ctx)
        if err != nil {
            panic(err)
        }
        err = json.Unmarshal(*getByIdResp.Source, &people)
        if err != nil {
            panic(err)
        }
        fmt.Println(people)
        // 范围查询
        searchByRangeResp, err := client.
            Search(Index).
            Query(elastic.NewRangeQuery("age").Gte(25).Lt(30)).
            FetchSourceContext(elastic.NewFetchSourceContext(true).Include("name", "age")).
            Sort("age", true).
            From(0).
            Size(2).
            Do(ctx)
        if err != nil {
            panic(err)
        }
        for _, value := range searchByRangeResp.Each(reflect.TypeOf(people)) {
            if t, ok := value.(People); ok {
                fmt.Println(t)
            }
        }
        // 单个关键词匹配查询
        searchByKeywordResp, err := client.
            Search(Index).
            Query(elastic.NewTermQuery("age", 25)).
            FetchSourceContext(elastic.NewFetchSourceContext(true).Include("name", "age")).
            Sort("age", true).
            From(0).
            Size(2).
            Do(ctx)
        if err != nil {
            panic(err)
        }
        for _, value := range searchByKeywordResp.Each(reflect.TypeOf(people)) {
            if t, ok := value.(People); ok {
                fmt.Println(t)
            }
        }
        // 多个关键词匹配查询(类似于IN)
        searchByKeywordsResp, err := client.
            Search(Index).
            Query(elastic.NewTermsQuery("name", "001", "002", "003")).
            FetchSourceContext(elastic.NewFetchSourceContext(true).Include("name", "age")).
            Sort("age", true).
            From(0).
            Size(2).
            Do(ctx)
        if err != nil {
            panic(err)
        }
        for _, value := range searchByKeywordsResp.Each(reflect.TypeOf(people)) {
            if t, ok := value.(People); ok {
                fmt.Println(t)
            }
        }
        // AND条件查询
        searchAndResp, err := client.
            Search(Index).
            Query(elastic.NewBoolQuery().Must(elastic.NewMatchQuery("desc", "谢谢"), elastic.NewMatchQuery("desc", "你"))).
            FetchSourceContext(elastic.NewFetchSourceContext(true).Include("name", "age")).
            Sort("age", true).
            From(0).
            Size(2).
            Do(ctx)
        if err != nil {
            panic(err)
        }
        for _, value := range searchAndResp.Each(reflect.TypeOf(people)) {
            if t, ok := value.(People); ok {
                fmt.Println(t)
            }
        }
        // OR条件查询
        searchOrResp, err := client.
            Search(Index).
            Query(elastic.NewBoolQuery().Should(elastic.NewMatchQuery("desc", "谢谢"), elastic.NewMatchQuery("desc", "你"))).
            FetchSourceContext(elastic.NewFetchSourceContext(true).Include("name", "age")).
            Sort("age", true).
            From(0).
            Size(2).
            Do(ctx)
        if err != nil {
            panic(err)
        }
        for _, value := range searchOrResp.Each(reflect.TypeOf(people)) {
            if t, ok := value.(People); ok {
                fmt.Println(t)
            }
        }
        // 查询包含指定字段的文档
        searchFieldExistsResp, err := client.
            Search(Index).
            Query(elastic.NewExistsQuery("name")).
            FetchSourceContext(elastic.NewFetchSourceContext(true).Include("name", "age")).
            Sort("age", true).
            From(0).
            Size(2).
            Do(ctx)
        if err != nil {
            panic(err)
        }
        for _, value := range searchFieldExistsResp.Each(reflect.TypeOf(people)) {
            if t, ok := value.(People); ok {
                fmt.Println(t)
            }
        }
        // 获取满足条件的文档总数量
        count, err := client.
            Count(Index).
            Query(elastic.NewTermQuery("age", 25)).
            Do(ctx)
        if err != nil {
            panic(err)
        }
        fmt.Println(count)
    }
文档更新时间: 2024-04-20 10:57   作者:lee