golang elasticsearch7的使用


本文摘自网络,作者,侵删。

### Golang操作elasticsearch7

* 包:github.com/olivere/elastic/v7

* elasticsearch版本7.6

  首先可以定义一个全量,构建连接池

      var esCli *elastic.Client

      func init() {

            var err error

            esCli, err = elastic.NewClient(elastic.SetSniff(false), elastic.SetURL("http://127.0.0.1:9200")

            if err != nil {

                panic(err)

            }

        }

使用方法

1、添加

    func EsAdd(es_index string, es_body interface{}) string {

        var id string

        rsAdd, err := esCli.Index().

            Index(es_index).

            BodyJson(es_body).

            Do(context.Background())

        if err != nil {

            panic(err)

        } else {

            id = rsAdd.Id

        }

        return id

    }

    PS:id是指ES自动生成的id,如果想自定义id可以在Index()后面加.Id(string)。目前用的是es7.6,所以可以不用加Type默认_doc,

    也可以指定方法Type()。



2、批量添加

    func EsAddBulk(es_index string, es_body []interface{}) {

        bulkRequest := esCli.Bulk()

        for _, v := range es_body {

            tmp := v

            req := elastic.NewBulkIndexRequest().Index(es_index).Doc(tmp)

            bulkRequest = bulkRequest.Add(req)

        }

        _, err := bulkRequest.Do(context.Background())

        if err != nil {

            panic(err)

        }

    }

3、添加

    func EsUpdate(es_index string, es_id string, es_body interface{}) {

        _, err := esCli.Update().

            Index(es_index).

            Id(es_id).

            Doc(es_body).

            Do(context.Background())

        if err != nil {

            panic(err)

        }

    }

4、批量修改

    func EsUpdateBulk(es_index string, es_body []map[string]string) {

        bulkRequest := esCli.Bulk()

        for _, v := range es_body {

            tmp := v

            tmps := make(map[string]string)

            for is, vs := range tmp {

                if is != "id" {

                    tmps[is] = vs

                }

            }

            req := elastic.NewBulkUpdateRequest().Index(es_index).Id(tmp["id"]).Doc(tmps).DocAsUpsert(true)

            bulkRequest = bulkRequest.Add(req)

        }

        _, err := bulkRequest.Do(context.Background())

        if err != nil {

          panic(err)

        }

    }

    PS:批量修改和批量增加方法是不同的,批量修改的方法NewBulkUpdateRequest,要调用这个才有DocAsUpsert。

    之前在NewBulkIndexRequest下一直没有找到DocAsUpsert。

    另外用[]map[string]string是因为每个数据要修改的key可能不同,如果要修改的key相同可以用interface 或 struct。

5、删除文档

    func Delete(es_index string, id string) {

        _, err := esCli.Delete().Index(es_index).Id(id).Do(context.Background())

        if err != nil {

            panic(err)

        }

    }

6、查询当前index是否存在

    func ExistsIndex(es_index string) bool {

        exists, err := esCli.IndexExists(es_index).Do(context.Background())

        if err != nil {

            panic(err)

        }

        return exists

    }

7、查询

    func Search(es_index string,page int ,li int) interface{} {

        p := (page - 1) * li

        collapsedata := elastic.NewCollapseBuilder("company")

        esq := elastic.NewBoolQuery()

        esq.Must(elastic.NewMatchPhraseQuery("company", "CO LTD."))

        esq.Must(elastic.NewMatchQuery("country", "US"))

        search := esCli.Search().

            Index(es_index).

            From(p).Size(li).

            Query(esq).

            Collapse(collapsedata).

            Pretty(true)

        searchResult, err := search.Do(context.Background())

        if err != nil {

            panic(err)

        } else {

            return searchResult

        }

    }

    PS:NewMatchPhraseQuery是代表短语的匹配,Collapse是指定字段相同结果的折叠

查找延伸:

像上面的结果返回的是es所有的参数,有时候只想用_Souce那要在把里面的结果抽取出来。官方也配有方法:

    func PrintTradedata(res *elastic.SearchResult, err error) tradedata {

        if err != nil {

            panic(err)

        }

        var typ tradedata

        var re tradedata

        for _, item := range res.Each(reflect.TypeOf(typ)) {

            te := item.(tradedata)

            jsonValue, _ := json.Marshal(te)

            json.Unmarshal(jsonValue, &re)

        }

        return re

    }

但是这种的话,也有一定的限制性就是如果我还想要_id的话可能又要自己在循环一边结构获取。所以我去看来官方的方法,然后自己重新写一遍:

    func PrintTradedata(res *elastic.SearchResult, err error) tradedata {

        if err != nil {

            panic(err)

        }

        var re tradedata

        for _, item := range res.Hits.Hits {

            if item.Source != nil {

                jsonValue, _ := json.Marshal(item.Source)

                json.Unmarshal(jsonValue, &re)

                re.ID = item.Id

            }

        }

        return re

    }

    这样就能提取出es的_id和_source的结合,可能觉得就这样几行为什么官方要封装多一个方法,

    其实官方封装的方法还做结构的验证安全性要比我的高,如果只要_source推荐还是用官方的。

以上就是一些golang使用es7的基本方法,低的版本也适用不过要加上type。es最强大的还是它的搜索功能我只是写了基础的,使用bool查询,还有term、math、fuzzy、wildcard等等,还有翻页scroll和search after,大家都可以去elastic包中查看。如果有需要,等有空我也可以写一篇专门关于搜索的用法。

上述内容欢迎大家指正和交流。


本文来自:简书

感谢作者:黑白码non

查看原文:golang elasticsearch7的使用

相关阅读 >>

android one和android Go有什么区别?

2021-02-22

[系列] Go - 学习 grpc.dial(target string, opts …dialoption) 的写法

Go微服务入门到容器化实践,落地可观测的微服务电商项目

聊聊dubbo-Go-proxy的route

Golang切片需要make吗

这可能是最容易理解的 Go mutex 源码剖析

Golang不能隐式转换吗

Go stl 查询 db 引发的内存泄露

Golang 为什么没有枚举

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...