Go一分钟对接ElasticSearch实践

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: 今天这篇分享:使用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
}


相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
1月前
|
负载均衡 算法 数据库连接
Go语言性能优化实践:案例分析与解决方案
【2月更文挑战第18天】本文将通过具体的案例分析,探讨Go语言性能优化的实践方法和解决方案。我们将分析几个典型的性能瓶颈问题,并详细介绍如何通过优化代码、调整并发模型、改进内存管理等方式来提升程序的性能。通过本文的学习,读者将能够掌握一些实用的Go语言性能优化技巧,为实际项目开发中的性能优化工作提供指导。
|
1月前
|
运维 网络协议 安全
长连接网关技术专题(十):百度基于Go的千万级统一长连接服务架构实践
本文将介绍百度基于golang实现的统一长连接服务,从统一长连接功能实现和性能优化等角度,描述了其在设计、开发和维护过程中面临的问题和挑战,并重点介绍了解决相关问题和挑战的方案和实践经验。
79 1
|
1月前
|
Java Go C++
Go语言中的面向对象编程实践
【2月更文挑战第10天】本文将深入探讨在Go语言中如何进行面向对象编程实践。我们将了解如何在Go中实现封装、继承和多态,以及如何利用结构体、接口和方法来构建健壮和可维护的对象导向程序。通过实际代码示例,我们将更好地理解Go的OOP特性,并学习如何有效地运用它们。
|
2月前
|
Go 开发者
Go语言中的错误处理与异常机制:实践与最佳策略
【2月更文挑战第7天】Go语言以其独特的错误处理机制而闻名,它鼓励显式错误检查而不是依赖于异常。本文将探讨错误处理与异常机制在Go语言中的实际应用,并分享一些最佳实践,帮助开发者编写更加健壮和易于维护的Go代码。
|
4月前
|
SQL API 索引
Superset对接ElasticSearch服务展示
Superset对接ElasticSearch服务展示
192 2
|
4月前
Elasticsearch采坑实践总结
Elasticsearch采坑实践总结
50 0
|
4月前
|
存储 Java Maven
SpringBoot整合Jest和Elasticsearch实践
SpringBoot整合Jest和Elasticsearch实践
107 1
|
1月前
|
Kubernetes Go 开发者
Go语言与Docker容器结合的实践应用与案例分析
【2月更文挑战第23天】本文通过分析实际案例,探讨了Go语言与Docker容器技术结合的实践应用。通过详细阐述Go语言在容器化环境中的开发优势,以及Docker容器技术在Go应用部署中的重要作用,本文旨在为读者提供Go语言与Docker容器结合的具体实现方法和实际应用场景。
|
1月前
|
安全 中间件 Go
Go语言Web服务性能优化与安全实践
【2月更文挑战第21天】本文将深入探讨Go语言在Web服务性能优化与安全实践方面的应用。通过介绍性能优化策略、并发编程模型以及安全加固措施,帮助读者理解并提升Go语言Web服务的性能表现与安全防护能力。
|
1月前
|
存储 算法 Go
泛型在Go语言中的引入与实践
【2月更文挑战第19天】Go语言1.18版本引入了对泛型的原生支持,这一特性使得开发者能够编写更加通用和灵活的代码。本文将深入探讨Go语言中泛型的引入背景、使用方法和实践案例,帮助读者了解并应用这一强大的编程工具。