乐清品牌网站建设,卫生局网站建设,怎样制作微信小程序,wordpress 内网 插件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…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 提供了强大的查询和聚合功能可以进行高级搜索、过滤、分组、计算等操作。数据可视化 通过 kibanaES 和 Logstash配套工具 可以进行数据进行可视化、仪表盘和数据报表展示。近实时复制和更新 ES支持近实时将数据复制到其他节点或集群近实时更新数据更新后很快就能检索到。插件和扩展性 丰富的插件通过插件扩展功能满足不同的需求。安全和权限控制 提供了 访问控制、认证和授权等功能保障数据安全性。
二、基本操作
在进行 ES 操作之前我们首先要将操作ES的包拉取
go get github.com/olivere/elastic/v72.0 创建ES链接 下面的示例中我们创建了一个 ES 链接用来操作ES在 common 包中并且 函数名GetESClient()是大写的表示外部包可访问。 package commonimport (fmtloggithub.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 (contextfmtloggithub.com/olivere/elastic/v7gotest.com/test/src/common
)// 创建结构体
type Content struct {Product string json:productColor string json:colorRelease_date string json:release_datePrice float32 json:priceProduct_agency []string json:product_agencyTypes string json:typesTitle string json:titleBrand string json:brandDesc 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 (contextfmtloggotest.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 (contextfmtloggotest.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 (contextencoding/jsonfmtloggithub.com/olivere/elastic/v7gotest.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 (contextfmtloggithub.com/olivere/elastic/v7gotest.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 语言的学习阶段想必有一些地方考虑的不全面本文示例全部是亲自手敲代码并且执行通过。 如有问题还请指教。 评论去告诉我哦一起学习一起进步