Skip to content

Go一分钟对接ElasticSearch实践

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

前言

本月会持续更新Go语言相关的文章,尤其是GoFrame,感兴趣的同学可以关注我,结伴而行。

同时会沉淀总结一下:《中台开发实践》、《私有化部署实践》、《深入理解goroutine及使用实践》、《如何在开发过程中把GO语言的价值体现出来》。

立志沉淀一些质量高的内容出来。

今天这篇分享:使用Go语言对接ElasticSearch实践。

说明

我下述示例代码基于GoFrame框架。

用Go一分钟对接ElasticSearch,前提是你已经搭建好了Es服务。

创建链接

  1. 我使用的es版本是v7
  2. 引入的logs是托管到gitlab的日志库,读者对接的时候不用管这里,用go或者goframe原生的日志库就可以
  3. 该方法返回es的客户端对象以供实例方法调用
go
package elastic import (    "github.com/gogf/gf/frame/g"    "github.com/olivere/elastic/v7"    "gitlab.xxx.com/xxxx/library.git/logs"    "log"    "os" ) func connection() (search *elastic.Client, err error) {    opts := []elastic.ClientOptionFunc{       elastic.SetURL("http://" + g.Cfg().Get("Es.Url").(string)),       elastic.SetSniff(false),       elastic.SetBasicAuth(g.Cfg().Get("Es.UserName").(string), g.Cfg().Get("Es.Password").(string)),       elastic.SetInfoLog(log.New(os.Stdout, "", log.LstdFlags)),       elastic.SetErrorLog(log.New(os.Stderr, "ELASTIC ", log.LstdFlags)),    }    client, err := elastic.NewClient(opts...)    if err != nil {       logs.Error("Es 链接失败 error:【%v】", err)    }    return client, err }

其中g.Cfg().Get是从配置文件中读取ES配置参数

配置文件示例:

/config/config.toml

toml
[Es] Url = "192.168.26.xxx:9200" UserName = "xxx" Password = "xxx" IndexGoods = "xxxx_index"

封装方法

封装请求文档的方法:

  1. 创建和es的链接
  2. 设置链接超时的时间
  3. 设置请求参数:索引、id
go
func GetDoc(req GetDocReq) (docContent *elastic.GetResult, err error) {    client, err := connection()    if err != nil || client == nil {       err = errors.New("elastic连接失败:" + err.Error())       return    }    defer client.Stop()    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)    defer cancel()    docContent, err = client.Get().Index(req.IndexName).Id(req.DocId).Do(ctx)    if err != nil {       err = errors.New("获取文档失败,错误原因:" + err.Error())       logs.Error("获取文档失败 错误原因:【%s】", err.Error())       return    }    return }

调用示例

非常简单:

  1. 定义好请求结构体
  2. 调用我们上面封装好的方法就可以了
go

```type GetDocReq struct {    DocId     string `json:"doc_id"`    IndexName string `json:"index_name"` } func TestDocId() {    res, err := GetDoc(GetDocReq{       DocId:     "goods_35138650",  //文档Id       IndexName: "goods_app_index", //索引名称    })    if err != nil {       g.Dump("err:", err)    }    g.Dump(res) }``

# 打印结果

铛铛铛~

是不是非常简单,我说的一分钟搞定对接ES没有骗人吧~

``` json
{         "_index": "goods_app_index",         "_type": "_doc",         "_id": "goods_35138650",         "_uid": "",         "_routing": "",         "_parent": "",         "_version": 1,         "_seq_no": 674993,         "_primary_term": 5,         "_source": {                 "gross_profit_rate": 173,                 "drop_reason": null,                 "shop_id": 40054,                 "real_sale": 0,                 "groups_ids": "",                 "max_profits": 228,                 "activity_ids": "",                 "total_stock": 999,                 "default_goods_id": 0,                 "discount": 8.300000190734863,                 "channel_id": 0,                 "third_category_name": "母婴用品,喂养用品,儿童餐具",                 "promotion_rate": 209,                 "stock": 999,                 "id": 35138650,                 "agreement_price": 1090,                 "is_free_shipping": true,                 "updated_time": 1649407211,                 "my_join_field": {                         "name": "goods"                 },                 "choose_count": 2,                 "unit": "",                 "title": "超市-儿童餐具盛广达米妮宽柄汤匙",                 "old_goods_title": "超市-儿童餐具盛广达米妮宽柄汤匙",                 "sale": 1231,                 "market_price": 5100,                 "brand_id": 258407,                 "guide_price": 1318,                 "activity_price": 0,                 "recommend": 1,                 "real_source": 0,                 "cover": "http://gfs17.gomein.net.cn/T1FLbzBvDv1RCvBVdK",                 "goods_tag_ids": "6",                 "min_profits": 228,                 "real_month_return_sale": 0,                 "type": "goods",                 "created_time": 1649234396,                 "goods_type": true,                 "real_return_sale": 0,                 "dis_category_id": "683983-683984-683985",                 "source": 10,                 "push_status": 0,                 "third_brand_name": "盛广达",                 "activity_rate": 0,                 "third_id": 43557,                 "origin": "",                 "status": 1,                 "category_id": "1-1007-1007015",                 "real_month_sale": 0,                 "psoriasis": false         },         "found": true }

总结

这篇是使用Go对接Es的入门文章,非常简单,也非常实用,为了让大家入门,不要对Es心存胆怯。

后面会更新基于Go对Es的更多操作: 通过搜索条件获取数据总数通过搜索条件 分页 获取数据滚动式查询 不可分页 获取数据分别使用tcp和http方式批量处理数据 1.增加 add 2.更新 update 3,删除 delete等。

对GO感兴趣的朋友可以查看我之前写的文章,了解一下Go的魅力:

Go语言为什么值得学习?

我的PHP转Go之旅

回顾一下我的Go学习之旅

非常适合PHP和Java转Go学习的框架:GoFrame

欢迎大家关注我的Go语言学习专栏,我会持续更新在Go学习和使用过程中的干货分享。

Go语言学习专栏

最后

感谢阅读,欢迎大家三连:点赞、收藏、投币(关注)!!!

8e95dac1fd0b2b1ff51c08757667c47a.gif

🚀 学习遇到瓶颈?想进大厂?

看完这篇技术文章,如果还是觉得不够系统,或者想在实战中快速提升?
王中阳的就业陪跑训练营,提供定制化学习路线 + 企业级实战项目 + 简历优化 + 模拟面试。

了解训练营详情