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可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
2月前
|
Go 调度 开发者
Go语言中的并发编程:深入理解与实践###
探索Go语言在并发编程中的独特优势,揭秘其高效实现的底层机制。本文通过实例和分析,引导读者从基础到进阶,掌握Goroutines、Channels等核心概念,提升并发处理能力。 ###
|
27天前
|
安全 Serverless Go
Go语言中的并发编程:深入理解与实践####
本文旨在为读者提供一个关于Go语言并发编程的全面指南。我们将从并发的基本概念讲起,逐步深入到Go语言特有的goroutine和channel机制,探讨它们如何简化多线程编程的复杂性。通过实例演示和代码分析,本文将揭示Go语言在处理并发任务时的优势,以及如何在实际项目中高效利用这些特性来提升性能和响应速度。无论你是Go语言的初学者还是有一定经验的开发者,本文都将为你提供有价值的见解和实用的技巧。 ####
|
1月前
|
算法 安全 程序员
Go语言的并发编程:深入理解与实践####
本文旨在探讨Go语言在并发编程方面的独特优势及其实现机制,通过实例解析关键概念如goroutine和channel,帮助开发者更高效地利用Go进行高性能软件开发。不同于传统的摘要概述,本文将以一个简短的故事开头,引出并发编程的重要性,随后详细阐述Go语言如何简化复杂并发任务的处理,最后通过实际案例展示其强大功能。 --- ###
|
1月前
|
监控 Go API
Go语言在微服务架构中的应用实践
在微服务架构的浪潮中,Go语言以其简洁、高效和并发处理能力脱颖而出,成为构建微服务的理想选择。本文将探讨Go语言在微服务架构中的应用实践,包括Go语言的特性如何适应微服务架构的需求,以及在实际开发中如何利用Go语言的特性来提高服务的性能和可维护性。我们将通过一个具体的案例分析,展示Go语言在微服务开发中的优势,并讨论在实际应用中可能遇到的挑战和解决方案。
|
2月前
|
Cloud Native Go API
Go语言在微服务架构中的创新应用与实践
本文深入探讨了Go语言在构建高效、可扩展的微服务架构中的应用。Go语言以其轻量级协程(goroutine)和强大的并发处理能力,成为微服务开发的首选语言之一。通过实际案例分析,本文展示了如何利用Go语言的特性优化微服务的设计与实现,提高系统的响应速度和稳定性。文章还讨论了Go语言在微服务生态中的角色,以及面临的挑战和未来发展趋势。
|
2月前
|
Go 开发者
Go语言中的并发编程:从基础到实践
在当今的软件开发中,并发编程已经成为了一项不可或缺的技能。Go语言以其简洁的语法和强大的并发支持,成为了开发者们的首选。本文将带你深入了解Go语言中的并发编程,从基础概念到实际应用,帮助你掌握这一重要的编程技能。
|
1月前
|
NoSQL 测试技术 Go
自动化测试在 Go 开源库中的应用与实践
本文介绍了 Go 语言的自动化测试及其在 `go mongox` 库中的实践。Go 语言通过 `testing` 库和 `go test` 命令提供了简洁高效的测试框架,支持单元测试、集成测试和基准测试。`go mongox` 库通过单元测试和集成测试确保与 MongoDB 交互的正确性和稳定性,使用 Docker Compose 快速搭建测试环境。文章还探讨了表驱动测试、覆盖率检查和 Mock 工具的使用,强调了自动化测试在开源库中的重要性。
|
1月前
|
Go
Go语言中的并发编程:深入探索与实践###
探索Go语言的并发编程,就像解锁了一把高效处理复杂任务的钥匙。本文旨在通过简明扼要的方式,阐述Goroutines和Channels如何协同工作,以实现高效的并发处理。不同于传统的技术文档,这里我们将用一个生动的故事来串联起这些概念,让你在轻松阅读中领悟到并发编程的精髓。 ###
|
2月前
|
消息中间件 监控 Go
Go语言在微服务架构中的优势与实践
【10月更文挑战第10天】Go语言在微服务架构中的优势与实践
|
2月前
|
Java Go 数据库
Go语言在微服务架构中的优势与实践
【10月更文挑战第10天】Go语言在微服务架构中的优势与实践