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 的实现的。
此篇就来聊聊如何用 Go 对 ES 进行检索等各种常用操作。
一、ElasticSearch 简介
ElasticSearch 是一个开源的分布式搜索和分析引擎,基于 Apache Lucene 开发的。被广泛用于实时检索、数据分析和数据可视化等领域,具有高性能、可扩展和强大的全文检索能力。
- 分布式和实时性: ES 架构允许数据在集群中分布,实现水平扩展和高吞吐量。能够在毫秒级别内实时对大量数据进行检索。
- 全文检索: 强大的全文搜索功能,支持多种查询、模糊检索等,能够高效地匹配和检索文本数据。
- 多数据支持: ES 不仅支持结构化数据,还可以存储和处理非结构化或半结构化的文本数据、地理空间数据等。
- RESTful API: ES提供简单易用的 RESUful API,允许通过HTTP请求进行数据操作和查询。
- 索引和分片: 数据存储以索引为单位存储,每个索引可以被分成多个分片,每个分片分布在不同的节点上。
- 查询和聚合: ES 提供了强大的查询和聚合功能,可以进行高级搜索、过滤、分组、计算等操作。
- 数据可视化: 通过 kibana(ES 和 Logstash配套工具) 可以进行数据进行可视化、仪表盘和数据报表展示。
- 近实时复制和更新: ES支持近实时将数据复制到其他节点或集群,近实时更新数据,更新后很快就能检索到。
- 插件和扩展性: 丰富的插件,通过插件扩展功能,满足不同的需求。
- 安全和权限控制: 提供了 访问控制、认证和授权等功能,保障数据安全性。
二、基本操作
在进行 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
三、第三方库
github.com/olivere/elastic/v7
- 是 ElasticSearch 官方维护的的 Go 客户端。
- 提供了丰富的的功能,包括 索引、查询、聚合、分页等。
- 支持链接池、超时控制、请求重试等特性。
github.com/elastic/go-elasticsearch/v7
- 是 ElasticSearch 官方维护的另一个客户端库,提供了更低级别的 API,可以更精细地控制请求和响应。
四、总结
优点:
- 高性能: Go语言本身具有更出色的性能,适合于处理高并发和大规模数据。使得 Go 操作 ElasticSearch 可以实现快速的数据索引、查询和分析。
- 并发处理: Go 语言支持轻量级协程(goroutine),可以更方便地实现并发和并行处理,从而提高 ElasticSearch 操作的效率。
- 第三方库: Go 社区中,多个优秀的第三方用于操作 ElasticSearch,方便开发。
缺点:
- 生态相对较小: 相对于其他一些编译语言,Go 语言的生态系统相对小。
- 少量的高级功能: ElasticSearch 的高级功能可能需要更丰富的配置和处理。
总的来说,使用 Go 语言操作 ElasticSearch 具有高性能、并发性和易维护性等优势,适用于需要快速、高效处理大量数据的场景。不过,也需要根据项目需求和团队技术栈的考量来决定是否选择 Go 语言来操作 ElasticSearch。
现阶段还是对 Go 语言的学习阶段,想必有一些地方考虑的不全面,本文示例全部是亲自手敲代码并且执行通过。
如有问题,还请指教。
评论去告诉我哦!!!一起学习一起进步!!!
相关文章:
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/Htt…...
Sentinel —实时监控
Sentinel 提供对所有资源的实时监控。如果需要实时监控,客户端需引入以下依赖(以 Maven 为例): <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artif…...
接口优化通用方案
目录 批量异步、回调缓存预取池化并行锁粒度索引大事务海量数据 批量 批量思想:批量操作数据库 优化前: //for循环单笔入库 for(TransDetail detail:transDetailList){ insert(detail); } 优化后: batchInsert(transDetailList); 异步、回…...
用Visual Studio 2022的.map文件来查看C++变量在内存中的布局情况
先看几个实例 代码1 #include <iostream> int data_arr[32768]; int main() {data_arr[1] 11;std::cout<<"data_arr[1]: " << data_arr[1] << std::endl;return data_arr[1]; } 上述代码在Win10 X64,MSVC Release模式下编译&…...
使用代理突破浏览器IP限制
一、实验目的: 主要时了解代理服务器的概念,同时如何突破浏览器IP限制 二、预备知识: 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去取得网络信息。形象的说:它是网络信息的中转站,特别是它具有一个cac…...
HuggingFace中的 Files and versions 如何优雅下载到本地?(Python requests,tqdm)
前言 在使用huggingface把玩各种大模型时,如果选择从远程加载模型,这个过程可能因为网络问题而非常耗时甚至直接失败,所以把模型、分词器等相关文件下载到本地,再直接从本地加载就成了不可回避的流程。 在进入具体版本的模型后&…...
三、原型模式
一、什么是原型模式 原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。在这里,原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效&a…...
transformer实现词性标注
1、self-attention 1.1、self-attention结构图 上图是 Self-Attention 的结构,在计算的时候需要用到矩阵 Q(查询), K(键值), V(值)。在实际中,Self-Attention 接收的是输入(单词的表示向量 x组成的矩阵 X) 或者上一个 Encoder block 的输出。而 Q, K, V…...
Java中异或操作和OTP算法
最近在研究加密算法,发现异或操作在加密算法中用途特别广,也特别好用。下面以Java语言为例,简单记录一下异或操作,以及在算法中的使用,包括常用的OTP算法。 一,异或操作特征 1, 相同出0&#…...
K8S最新版本集群部署(v1.28) + 容器引擎Docker部署(下)
温故知新 📚第三章 Kubernetes各组件部署📗安装kubectl(可直接跳转到安装kubeadm章节,直接全部安装了)📕下载kubectl安装包📕执行kubectl安装📕验证kubectl 📗安装kubead…...
女子垒球运动的发展·垒球1号位
女子垒球运动的发展 1. 女子垒球运动的起源和发展概述 女子垒球运动,诞生于19世纪末的美国,作为棒球运动的衍生品,经过百年的积淀,已在全球范围内广泛传播,形成了丰富的赛事文化。她的起源,可以追溯到19世…...
Debian 30 周年,生日快乐!
导读近日是 Debian 日,也是由伊恩-默多克(Ian Murdock)创立的 Debian GNU/Linux 通用操作系统和社区支持的 Debian 项目 30 周年纪念日。 不管你信不信,从已故的伊恩-默多克于 1993 年 8 月 16 日宣布成立 Debian 项目,…...
字符串匹配的Rabin–Karp算法
leetcode-28 实现strStr() 更熟悉的字符串匹配算法可能是KMP算法, 但在Golang中,使用的是Rabin–Karp算法 一般中文译作 拉宾-卡普算法,由迈克尔拉宾与理查德卡普于1987年提出 “ 要在一段文本中找出单个模式串的一个匹配,此算法具有线性时间的平均复杂度࿰…...
傅里叶变换(FFT)笔记存档
参考博客:https://www.luogu.com.cn/blog/command-block/fft-xue-xi-bi-ji 目录: FFT引入复数相关知识单位根及其相关性质DFT过程(难点)DFT结论(重要)IDFT结论(重要)IDFT结论证明&…...
ELK安装、部署、调试 (二) ES的安装部署
ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口操作ES,也可以利用Java API。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业…...
Android 13 - Media框架(8)- MediaExtractor
上一篇我们了解了 GenericSource 需要依赖 IMediaExtractor 完成 demux 工作,这一篇我们就来学习 android media 框架中的第二个服务 media.extractor,看看 IMediaExtractor 是如何创建与工作的。 1、MediaExtractorService media.extractor 和 media.p…...
Flutter 混合开发调试
针对Flutter开发的同学来说,大部分的应用还是Native Flutter的混合开发,所以每次改完Flutter代码,运行整个项目无疑是很费时间的。所以Flutter官方也给我们提供了混合调试的方案【在混合开发模式下进行调试】,这里以Android Stud…...
C语言每日一练------(Day3)
本专栏为c语言练习专栏,适合刚刚学完c语言的初学者。本专栏每天会不定时更新,通过每天练习,进一步对c语言的重难点知识进行更深入的学习。 今天练习题的关键字: 尼科彻斯定理 等差数列 💓博主csdn个人主页:…...
14、监测数据采集物联网应用开发步骤(10)
监测数据采集物联网应用开发步骤(9.2) Modbus rtu协议开发 本章节在《监测数据采集物联网应用开发步骤(7)》基础上实现可参考《...开发步骤(7)》调试工具,本章节代码需要调用modbus_tk组件,阅读本章节前建议baidu熟悉modbus rtu协议内容 组件安装modb…...
Linux禅道上修改Apache 和 MySQL 默认端口号
1. 修改Apache默认端口号 80 cd /opt/zbox/etc/apachevim httpd.conf :wq 保存 2. 修改MySQL默认端口号 3306 cd /opt/zbox/etc/mysql vim my.cnf :wq 保存 3. 重启服务 ./zbox restart...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
tomcat指定使用的jdk版本
说明 有时候需要对tomcat配置指定的jdk版本号,此时,我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...
热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
算法刷题-回溯
今天给大家分享的还是一道关于dfs回溯的问题,对于这类问题大家还是要多刷和总结,总体难度还是偏大。 对于回溯问题有几个关键点: 1.首先对于这类回溯可以节点可以随机选择的问题,要做mian函数中循环调用dfs(i&#x…...
信息系统分析与设计复习
2024试卷 单选题(20) 1、在一个聊天系统(类似ChatGPT)中,属于控制类的是()。 A. 话语者类 B.聊天文字输入界面类 C. 聊天主题辨别类 D. 聊天历史类 解析 B-C-E备选架构中分析类分为边界类、控制类和实体类。 边界…...
