一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
前言
本月会持续更新Go语言相关的文章,尤其是GoFrame,感兴趣的同学可以关注我,结伴而行。
同时会沉淀总结一下:《中台开发实践》、《私有化部署实践》、《深入理解goroutine及使用实践》、《如何在开发过程中把GO语言的价值体现出来》。
立志沉淀一些质量高的内容出来。
今天这篇分享:使用Go语言对接ElasticSearch实践。
说明
我下述示例代码基于GoFrame框架。
用Go一分钟对接ElasticSearch,前提是你已经搭建好了Es服务。
创建链接
- 我使用的es版本是v7
- 引入的logs是托管到gitlab的日志库,读者对接的时候不用管这里,用go或者goframe原生的日志库就可以
- 该方法返回es的客户端对象以供实例方法调用
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
[Es]
Url = "192.168.26.xxx:9200"
UserName = "xxx"
Password = "xxx"
IndexGoods = "xxxx_index"
封装方法
封装请求文档的方法:
- 创建和es的链接
- 设置链接超时的时间
- 设置请求参数:索引、id
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
}
调用示例
非常简单:
- 定义好请求结构体
- 调用我们上面封装好的方法就可以了
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没有骗人吧~
{
"_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语言学习专栏
,我会持续更新在Go学习和使用过程中的干货分享。
最后
感谢阅读,欢迎大家三连:点赞、收藏、投币(关注)!!!