GO学习之 搜索引擎(ElasticSearch)

GO系列

1、GO学习之Hello World
2、GO学习之入门语法
3、GO学习之切片操作
4、GO学习之 Map 操作
5、GO学习之 结构体 操作
6、GO学习之 通道(Channel)
7、GO学习之 多线程(goroutine)
8、GO学习之 函数(Function)
9、GO学习之 接口(Interface)
10、GO学习之 网络通信(Net/Http)
11、GO学习之 微框架(Gin)
12、GO学习之 数据库(mysql)
13、GO学习之 数据库(Redis)
14、GO学习之 搜索引擎(ElasticSearch)

文章目录

  • GO系列
  • 前言
  • 一、ElasticSearch 简介
  • 二、基本操作
    • 2.0 创建ES链接
    • 2.1 增
    • 2.2 删
    • 2.3 改
    • 2.4 检索
      • 2.4.1 分页获取全部数据
      • 2.4.2 各种检索
        • 2.4.2.1 match 检索
        • 2.4.2.2 prefix 前缀匹配
        • 2.4.2.3 phrase 前缀匹配
        • 2.4.2.4 phrase 短语匹配
        • 2.4.2.5 match 多字段匹配
        • 2.4.2.6 term 精确匹配
        • 2.4.2.7 terms 多值精确匹配
        • 2.4.2.8 fuzzy 模糊匹配
        • 2.4.2.9 bool 组合匹配
        • 2.4.2.10 dis max 最佳字段匹配
    • 2.4.3 聚合操作
  • 三、第三方库
  • 四、总结

前言

按照公司目前的任务,go 学习是必经之路了,虽然行业卷,不过技多不压身,依旧努力!!!
一个网站或者一个平台好不了模糊检索,传统的SQL检索无法满足,而且效率也地下,所以目前大多数项目中搜索都用的是搜索引擎(ElasticSearch较多,简称 ES),那什么是 ES呢?请移步 ElasticSearch学习随笔之基础介绍 等系列文章,项目中客户端使用也是 JAVA 的实现的。
此篇就来聊聊如何用 GoES 进行检索等各种常用操作。

一、ElasticSearch 简介

ElasticSearch 是一个开源的分布式搜索和分析引擎,基于 Apache Lucene 开发的。被广泛用于实时检索、数据分析和数据可视化等领域,具有高性能、可扩展和强大的全文检索能力。

  1. 分布式和实时性: ES 架构允许数据在集群中分布,实现水平扩展和高吞吐量。能够在毫秒级别内实时对大量数据进行检索。
  2. 全文检索: 强大的全文搜索功能,支持多种查询、模糊检索等,能够高效地匹配和检索文本数据。
  3. 多数据支持: ES 不仅支持结构化数据,还可以存储和处理非结构化或半结构化的文本数据、地理空间数据等。
  4. RESTful API: ES提供简单易用的 RESUful API,允许通过HTTP请求进行数据操作和查询。
  5. 索引和分片: 数据存储以索引为单位存储,每个索引可以被分成多个分片,每个分片分布在不同的节点上。
  6. 查询和聚合: ES 提供了强大的查询和聚合功能,可以进行高级搜索、过滤、分组、计算等操作。
  7. 数据可视化: 通过 kibana(ES 和 Logstash配套工具) 可以进行数据进行可视化、仪表盘和数据报表展示。
  8. 近实时复制和更新: ES支持近实时将数据复制到其他节点或集群,近实时更新数据,更新后很快就能检索到。
  9. 插件和扩展性: 丰富的插件,通过插件扩展功能,满足不同的需求。
  10. 安全和权限控制: 提供了 访问控制、认证和授权等功能,保障数据安全性。

二、基本操作

在进行 ES 操作之前,我们首先要将操作ES的包拉取:

go get github.com/olivere/elastic/v7

2.0 创建ES链接

下面的示例中,我们创建了一个 ES 链接,用来操作ES,在 common 包中,并且 函数名(GetESClient())是大写的,表示外部包可访问。

package commonimport ("fmt""log""github.com/olivere/elastic/v7"
)func GetESClient() *elastic.Client {// 建立 ElasticSearch 连接client, err := elastic.NewClient(elastic.SetURL("http://192.168.1.8:9200"))if err != nil {log.Fatal(err)}fmt.Println("ES链接创建成功!")return client
}

2.1 增

下面示例是利用 Bulk批量新增操作,获取到 ES 的链接后,通过 esClient.Bulk()创建批量操作 Bulk,然后再通过 Add(doc)把文档添加到批量操作里面,最后 Do() 执行操作。

package mainimport ("context""fmt""log""github.com/olivere/elastic/v7""gotest.com/test/src/common"
)// 创建结构体
type Content struct {Product        string   `json:"product"`Color          string   `json:"color"`Release_date   string   `json:"release_date"`Price          float32  `json:"price"`Product_agency []string `json:"product_agency"`Types          string   `json:"types"`Title          string   `json:"title"`Brand          string   `json:"brand"`Desc           string   `json:"desc"`
}func main() {// 建立 ElasticSearch 连接esClient := common.GetESClient()// 创建文档contents := []Content{{Product: "Xbox Series 10", Color: "black", Release_date: "2023-08-27", Price: 500.25, Product_agency: []string{"玩游戏", "看电影"}, Types: "gaming console",Title: "微软 Xbox Y", Brand: "Microsoft", Desc: "这是一款拥有强大性能和兼容性的游戏机, 能看电影,红色的",},{Product: "Xbox Series 10", Color: "green", Release_date: "2023-08-27", Price: 500.25, Product_agency: []string{"玩游戏", "看电影"}, Types: "gaming console",Title: "微软 Xbox Y", Brand: "Microsoft", Desc: "这是一款拥有强大性能和兼容性的游戏机, 能看电影,绿色的",},}// 批量操作bulkRequest := esClient.Bulk()// 批量添加文档for _, content := range contents {doc := elastic.NewBulkCreateRequest().Index("electronics").UseEasyJSON(true).Doc(&content)bulkRequest.Add(doc)}// 执行批量添加操作result, err := bulkRequest.Do(context.Background())if err != nil {log.Fatal(err)}fmt.Printf("成功添加 %v 个文档", len(result.Succeeded()))
}

2.2 删

此示例通过 ID 删除文档。

package mainimport ("context""fmt""log""gotest.com/test/src/common"
)func main() {// 建立 ElasticSearch 连接esClient := common.GetESClient()_, err := esClient.Delete().Index("electronics").Id("n72VNooB2xU2Yn1oN-Bc").Do(context.Background())if err != nil {log.Fatal(err)}fmt.Println("删除成功!")
}

2.3 改

此案例按照 ID 修改。

package mainimport ("context""fmt""log""gotest.com/test/src/common"
)func main() {// 建立 ElasticSearch 连接esClient := common.GetESClient()_, err := esClient.Update().Index("electronics").Id("nr2VNooB2xU2Yn1oN-Bc").Doc(map[string]interface{}{"title": "微软 Xbox Z"}).Do(context.Background())if err != nil {log.Fatal(err)}fmt.Println("文档已更新!")
}

2.4 检索

2.4.1 分页获取全部数据

package mainimport ("context""encoding/json""fmt""log""github.com/olivere/elastic/v7""gotest.com/test/src/common"
)func main() {// 建立 ElasticSearch 连接esClient := common.GetESClient()// match all 数据匹配query := elastic.NewMatchAllQuery()// 检索 从 0 到 10 条数据result, err := esClient.Search().Index("electronics").Query(query).From(0).Size(10).Do(context.Background())if err != nil {log.Fatal(err)}// 定一个 结构体,结构化数据type product struct {Product stringColor   stringTitle   string}// 处理数据结果fmt.Printf("总条数:%+v\n", result.Hits.TotalHits.Value)for index, hit := range result.Hits.Hits {p := &product{}// hit.Source 获取到的数据,经过 json 反序列化转换成 product 结构体pErr := json.Unmarshal(hit.Source, p)if pErr != nil {log.Fatal(pErr)}fmt.Println(index, p)}
}

运行结果:

PS D:\workspaceGo\src\elasticSearch> go run .\query.go
ES链接创建成功!
总条数:22
0 &{Galaxy S21 white 三星 Galaxy S21}
1 &{Galaxy S21 white 三星 Galaxy S21}
2 &{Canon EOS 5D Mark IV black 佳能 EOS 5D Mark IV}
3 &{Sony A7 III black 索尼 A7 III}
4 &{GoPro HERO10 Black black GoPro HERO10 Black}
5 &{Apple Watch Series 7 space gray 苹果 Watch Series 7}
6 &{Samsung Galaxy Watch 4 black 三星 Galaxy Watch 4}
7 &{Nintendo Switch OLED red/blue 任天堂 Switch OLED}
8 &{PlayStation 5 white 索尼 PlayStation 5}
9 &{Xbox Series X black 微软 Xbox Series X}

2.4.2 各种检索

2.4.2.1 match 检索

query := elastic.NewMatchQuery("brand", "Apple")

2.4.2.2 prefix 前缀匹配

query := elastic.NewMatchBoolPrefixQuery("title", "三")

2.4.2.3 phrase 前缀匹配

query := elastic.NewMatchPhrasePrefixQuery("desc", "时尚与智能")

2.4.2.4 phrase 短语匹配

query := elastic.NewMatchPhraseQuery("desc", "时尚与智能")

2.4.2.5 match 多字段匹配

query := elastic.NewMultiMatchQuery("苹果", "title", "brand", "product")

2.4.2.6 term 精确匹配

query := elastic.NewTermQuery("type", "mobile")

2.4.2.7 terms 多值精确匹配

query := elastic.NewTermsQuery("color", "white", "black")

2.4.2.8 fuzzy 模糊匹配

	// Fuzziness 检索模糊距离query := elastic.NewFuzzyQuery("desc", "手机").Fuzziness(5)

2.4.2.9 bool 组合匹配

query := elastic.NewBoolQuery().Should(elastic.NewMatchQuery("title", "手机"), elastic.NewTermQuery("type", "mobile"))

2.4.2.10 dis max 最佳字段匹配

query := elastic.NewDisMaxQuery().Query(elastic.NewMatchQuery("title", "苹果"), elastic.NewMatchQuery("desc", "苹果"))

2.4.3 聚合操作

package mainimport ("context""fmt""log""github.com/olivere/elastic/v7""gotest.com/test/src/common"
)
func main() {// 建立 ElasticSearch 连接esClient := common.GetESClient()// 构建统计agg := elastic.NewTermsAggregation().Field("color.keyword")// 执行搜索和聚合操作result, err := esClient.Search().Index("electronics").Aggregation("by_color", agg).Do(context.Background())if err != nil {log.Fatal(err)}// 处理聚合结果aggResult, found := result.Aggregations.Terms("by_color")if found {for _, bucket := range aggResult.Buckets {fmt.Printf("color: %v, count: %v \n", bucket.Key, bucket.DocCount)}}
}

运行结果:

PS D:\workspaceGo\src\elasticSearch> go run .\aggregation.go
ES链接创建成功!
color: black, count: 9 
color: white, count: 6
color: silver, count: 3
color: red/blue, count: 1
color: space gray, count: 1
color: stainless steel, count: 1

三、第三方库

  1. github.com/olivere/elastic/v7
  • 是 ElasticSearch 官方维护的的 Go 客户端。
  • 提供了丰富的的功能,包括 索引、查询、聚合、分页等。
  • 支持链接池、超时控制、请求重试等特性。
  1. github.com/elastic/go-elasticsearch/v7
  • 是 ElasticSearch 官方维护的另一个客户端库,提供了更低级别的 API,可以更精细地控制请求和响应。

四、总结

优点:

  1. 高性能: Go语言本身具有更出色的性能,适合于处理高并发和大规模数据。使得 Go 操作 ElasticSearch 可以实现快速的数据索引、查询和分析。
  2. 并发处理: Go 语言支持轻量级协程(goroutine),可以更方便地实现并发和并行处理,从而提高 ElasticSearch 操作的效率。
  3. 第三方库: Go 社区中,多个优秀的第三方用于操作 ElasticSearch,方便开发。

缺点:

  1. 生态相对较小: 相对于其他一些编译语言,Go 语言的生态系统相对小。
  2. 少量的高级功能: ElasticSearch 的高级功能可能需要更丰富的配置和处理。

总的来说,使用 Go 语言操作 ElasticSearch 具有高性能、并发性和易维护性等优势,适用于需要快速、高效处理大量数据的场景。不过,也需要根据项目需求和团队技术栈的考量来决定是否选择 Go 语言来操作 ElasticSearch。


现阶段还是对 Go 语言的学习阶段,想必有一些地方考虑的不全面,本文示例全部是亲自手敲代码并且执行通过。
如有问题,还请指教。
评论去告诉我哦!!!一起学习一起进步!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/60479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker部署前端项目保姆级教程

本地启动docker(有不会启动的吗?下载docker(小海豚)双击起来就行) 准备阿里云账号(免费) 没有就去注册一个,记住密码后面要用到 官网地址:阿里云登录 - 欢迎登录阿里云…

初次使用ubuntu系统

作者前言 之前都是用centos,因了解到centos要停止更新、红帽要闭源等消息。还是切换其他的开源系统,避免后续的使用受到影响。第一次使用ubuntu很不习惯,配置文件和命令有些都不太一样。所以就想写个文章把ubuntu的操作做个笔记。 持续更新…

目标检测模型 pdf (记录链接后期学习)

参考 PaddleOCR——封装PP-Structure成一个简单的服务(dockerfile) 超越OCR的富文档内容解析神器LayoutParser python版面分析工具layout parser 的安装和使用 使用layout parser包分析PDF https://github.com/Layout-Parser/layout-parser ChatPDF | L…

各个微服务模块之间互相依赖调用的问题

首先是模块之间不能够循环引用,否则会报循环依赖引入的错误。 没有了模块之间的相互依赖,在项目中这两个模块是相互调用的,分别各自定义相应的Feign接口,如下: 最开始写的运行报错的代码如下: FeignCli…

Axure RP

Axure RP 简介下载安装汉化注册 简介 Axure RP(Rapid Prototyping)是一款交互式原型设计工具,用于创建高保真的交互式界面原型和线框图。它主要用于用户体验(UX)和用户界面(UI)设计&#xff0c…

PyCharm软件安装包分享(附安装教程)

目录 一、软件简介 二、软件下载 一、软件简介 PyCharm是一种集成开发环境(IDE),专门为Python开发者设计。它是由捷克软件公司JetBrains开发的,为Python开发人员提供了高效、易用和功能丰富的工具集。 以下是PyCharm软件的主要…

机器学习——手写数字识别

0、:前言 这篇文章能够帮助你从数据到模型的整个过程实现不过至于安装第三方库等基础问题,本文不涉及,因为确实不难,搜一搜一大把本此实验运行环境为jupyter,当然通过pycharm也是可行的 1、数据: 手写数字…

【网络设备】交换机的概念、工作原理、功能以及以太网帧格式

个人主页:insist--个人主页​​​​​​ 本文专栏:网络基础——带你走进网络世界 本专栏会持续更新网络基础知识,希望大家多多支持,让我们一起探索这个神奇而广阔的网络世界。 目录 一、认识交换机 二、交换机的主要功能 1、数…

非计算机科班如何丝滑转码?(本人就是有点不丝滑)

我觉得无非三个办法可以选择(当然可能有其他方法) 自学 报班 有师傅带 但是在学习之前,你一定要明确你学习编程的目的是什么! 游戏开发?后台研发?爬虫工程师?前端程序员?数据分析师? 或者 仅仅是想做一…

【ES6】Proxy的高级用法,实现一个生成各种 DOM 节点的通用函数dom

下面的例子则是利用get拦截&#xff0c;实现一个生成各种 DOM 节点的通用函数dom。 <body> </body><script>const dom new Proxy({}, {get(target, property) {return function(attrs {}, ...children) {const el document.createElement(property);for …

ElasticSearch(一)数据类型

ElasticSearch&#xff08;一&#xff09;数据类型 1.简述 Es数据类型分为基础数据类型和复杂类型数据&#xff0c;掌握ES数据类型才能进一步使用ES检索数据内容。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot…

CSS中的margin与padding

目录 一、margin 1.概念及作用 2.基本语法 3.margin的用法 二、padding 1.介绍 2.基本语法及要求 3. 用法 4.内边距和元素宽度 讲这些之前&#xff0c;先看一张图&#xff0c;便于理解 一、margin 1.概念及作用 CSS margin 属性用于在任何定义的边框之外&#xff0c;…

网深科技与中科方德完成兼容性认证

网深科技的产品NetInside可观测性分析平台与国产中科方德主流操作系统完成兼容性适配&#xff0c;系统名称&#xff1a;方德高可信服务器操作系统V4.0&#xff0c;系统运行稳定&#xff0c;性能卓越&#xff0c;完美兼容&#xff0c;能够为广大用户提供灵活、专业、直观可视性&…

docker 安装 Nginx

1、下载 docker pull nginx:latest 2、本地创建管理目录 mkdir -p /var/docker/nginx/conf mkdir -p /var/docker/nginx/log mkdir -p /var/docker/nginx/html 3、将容器中的相应文件复制到管理目录中 /usr/docker/nginx docker run --name nginx -p 80:80 -d nginxdocke…

tensorrtx部署yolov5 6.0

文章目录 一. yolov5 v6.0训练模型二.训练好的yolov5模型转tensorrt引擎 一. yolov5 v6.0训练模型 官网下载yolov5 v6.0代码 下载官方预训练好的模型 安装yolov5所需要的库文件&#xff0c;requirements.txt在下载好的yolov5源代码中有 pip install -r C:\Users\10001540…

Verilog 学习路线

参考知乎 首先得学习数电和 Verilog 基础。 常问的 Verilog 基础 二分频是怎么写的 阻塞和非阻塞及其应用 写一个100MHz的时钟 Reg 和 wire 的区别 Logic 和 wire 的区别&#xff0c;两者可以转换吗 用你最擅长的语言找出1-100的质数 一个最简单的八位加法器应该怎么验…

论文笔记:基于概念漂移的在线类非平衡学习系统研究

0 摘要 论文&#xff1a;A Systematic Study of Online Class Imbalance Learning With Concept Drift 发表&#xff1a;2018年发表在TNNLS上 源代码&#xff1a;&#xff1f; 作为一个新兴的研究课题&#xff0c;在线类非平衡学习往往结合了类非平衡和概念漂移的挑战。它处理…

C++中使用 if…else 有条件地执行多条语句

C中使用 if…else 有条件地执行多条语句 如果要在满足&#xff08;或不满足&#xff09;条件时执行多条语句&#xff0c;需要将它们组合成一个语句块。包含在大括号&#xff08;{}&#xff09;内的多条语句被视为语句块&#xff0c;例如&#xff1a; if (condition) {// cond…

C语言每日一练------------Day(7)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字&#xff1a;两个数组的交集     双指针 &#x1f493;博主csdn个人主页&#xf…

Java自定义捕获异常

需求分析 ElectricalCustomerVO electricalCustomerVO new ElectricalCustomerVO(); electricalCustomerVO.setElcNumber(chatRecordsLog.getDeviceNumber()); List<ElectricalCustomerVO> electricalCustomerlist electricalCustomerMapper.selectElectricalCustomer…