Go一分钟对接ElasticSearch实践

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

说明


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

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


创建链接


  1. 我使用的es版本是v7
  2. 引入的logs是托管到gitlab的日志库,读者对接的时候不用管这里,用go或者goframe原生的日志库就可以
  3. 该方法返回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"


封装方法


封装请求文档的方法:


  1. 创建和es的链接
  2. 设置链接超时的时间
  3. 设置请求参数:索引、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
}


调用示例


非常简单:


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


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
}


相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。  
相关文章
|
7月前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
411 86
|
9月前
|
分布式计算 算法 安全
Go语言泛型-泛型约束与实践
Go语言中的泛型约束用于限制类型参数的范围,提升类型安全性。通过接口定义约束,可实现对数值类型、排序与比较等操作的支持。开发者既可使用标准库提供的预定义约束,如constraints.Ordered和constraints.Comparable,也可自定义约束以满足特定需求。泛型广泛应用于通用数据结构(如栈、队列)、算法实现(如排序、查找)及构建高效可复用的工具库,使代码更简洁灵活。
|
10月前
|
设计模式 人工智能 Go
go 依赖注入实践
依赖注入(DI)是一种软件设计模式,旨在降低代码耦合度,提高代码可测试性和可复用性。其核心思想是将依赖项从外部传入使用对象,而非由其内部创建。通过 DI,模块间关系更清晰,便于维护和扩展。常见实现包括方法注入和接口注入,适用于如 Go 等支持函数式编程和接口抽象的语言。
218 8
|
10月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:路由、中间件、参数校验
Gin框架以其极简风格、强大路由管理、灵活中间件机制及参数绑定校验系统著称。本文详解其核心功能:1) 路由管理,支持分组与路径参数;2) 中间件机制,实现全局与局部控制;3) 参数绑定,涵盖多种来源;4) 结构体绑定与字段校验,确保数据合法性;5) 自定义校验器扩展功能;6) 统一错误处理提升用户体验。Gin以清晰模块化、流程可控及自动化校验等优势,成为开发者的优选工具。
|
10月前
|
开发框架 安全 前端开发
Go Web开发框架实践:模板渲染与静态资源服务
Gin 是一个功能强大的 Go Web 框架,不仅适用于构建 API 服务,还支持 HTML 模板渲染和静态资源托管。它可以帮助开发者快速搭建中小型网站,并提供灵活的模板语法、自定义函数、静态文件映射等功能,同时兼容 Go 的 html/template 引擎,具备高效且安全的页面渲染能力。
|
10月前
|
开发框架 JSON 中间件
Go语言Web开发框架实践:使用 Gin 快速构建 Web 服务
Gin 是一个高效、轻量级的 Go 语言 Web 框架,支持中间件机制,非常适合开发 RESTful API。本文从安装到进阶技巧全面解析 Gin 的使用:快速入门示例(Hello Gin)、定义 RESTful 用户服务(增删改查接口实现),以及推荐实践如参数校验、中间件和路由分组等。通过对比标准库 `net/http`,Gin 提供更简洁灵活的开发体验。此外,还推荐了 GORM、Viper、Zap 等配合使用的工具库,助力高效开发。
|
11月前
|
设计模式 缓存 算法
Go如何进行高质量编程与性能调优实践
本文介绍了Go语言高质量编程与性能调优的实践方法。高质量编程包括良好的编码习惯(如清晰注释、命名规范)、代码风格与设计(如MVC模式)、简洁明了的代码原则,以及单元测试与代码重构的重要性。性能调优方面,涵盖算法优化、数据结构选择、I/O优化、内存管理、并行与并发处理优化及代码层面的改进。通过这些方法,可有效提升代码质量和系统性能。
211 13
|
9月前
|
Linux Go 开发者
Go语言泛型-泛型约束与实践
《Go语言实战指南》介绍了如何使用Go进行交叉编译,即在一个操作系统上编译出适用于不同系统和架构的二进制文件。通过设置GOOS和GOARCH环境变量,开发者可轻松构建跨平台程序,无需在每个平台上单独编译。Go从1.5版本起原生支持此功能,极大提升了多平台部署效率。
|
存储 运维 监控
金融场景 PB 级大规模日志平台:中信银行信用卡中心从 Elasticsearch 到 Apache Doris 的先进实践
中信银行信用卡中心每日新增日志数据 140 亿条(80TB),全量归档日志量超 40PB,早期基于 Elasticsearch 构建的日志云平台,面临存储成本高、实时写入性能差、文本检索慢以及日志分析能力不足等问题。因此使用 Apache Doris 替换 Elasticsearch,实现资源投入降低 50%、查询速度提升 2~4 倍,同时显著提高了运维效率。
905 3
金融场景 PB 级大规模日志平台:中信银行信用卡中心从 Elasticsearch 到 Apache Doris 的先进实践
|
数据采集 人工智能 运维
从企业级 RAG 到 AI Assistant,阿里云Elasticsearch AI 搜索技术实践
本文介绍了阿里云 Elasticsearch 推出的创新型 AI 搜索方案。
1052 5