GO学习之 搜索引擎(ElasticSearch)

这篇具有很好参考价值的文章主要介绍了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)
15、GO学习之 消息队列(Kafka)
16、GO学习之 远程过程调用(RPC)
17、GO学习之 goroutine的调度原理

前言

按照公司目前的任务,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 common

import (
	"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 main

import (
	"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 main

import (
	"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 main

import (
	"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 main

import (
	"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 string
		Color   string
		Title   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 main

import (
	"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 语言的学习阶段,想必有一些地方考虑的不全面,本文示例全部是亲自手敲代码并且执行通过。
如有问题,还请指教。
评论去告诉我哦!!!一起学习一起进步!!!文章来源地址https://www.toymoban.com/news/detail-676656.html

到了这里,关于GO学习之 搜索引擎(ElasticSearch)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 分布式搜索引擎Elasticsearch基础入门学习

    Elasticsearh 是 elastic.co 公司开发的分布式搜索引擎。 Elasticsearch(简称ES)是一个开源的分布式、高度可扩展的全文搜索和分析引擎。它能够快速、近乎实时的存储、搜索和分析大量数据。适用于包括文本、数字、地理空间、结构化和非结构化数据等在内的所有类型数据。 它通

    2024年02月03日
    浏览(37)
  • Spring Cloud学习(九)【Elasticsearch 分布式搜索引擎01】

    Elasticsearch 是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容。 elasticsearch 结合 kibana、Logstash、Beats,也就是 elastic stack(ELK) 。被广泛应用在日志数据分析、实时监控等领域。 elasticsearch 是 elastic stack 的核心,负责 存储、搜索、分析数据 。

    2024年02月05日
    浏览(39)
  • Spring Cloud学习(十一)【深入Elasticsearch 分布式搜索引擎03】

    聚合(aggregations)可以实现对文档数据的统计、分析、运算。聚合常见的有三类: 桶(Bucket)聚合:用来对文档做分组 TermAggregation:按照文档字段值分组 Date Histogram:按照日期阶梯分组,例如一周为一组,或者一月为一组 度量(Metric)聚合:用以计算一些值,比如:最大值

    2024年01月23日
    浏览(46)
  • 【Golang系统开发】搜索引擎(2) 压缩词典

    这篇文章我们就给出一系列的数据结构,使得词典能达到越来越高的压缩比。当然,和倒排索引记录表的大小相比,词典只占据了非常小的空间。那么为什么要对词典进行压缩呢? 这是因为决定信息检索系统的查询响应时间的一个重要因素就是磁盘的访问次数,而如果有部分

    2024年02月12日
    浏览(26)
  • 【Golang系统开发】搜索引擎(3) 压缩倒排索引表

    假设我们的数据集中有 800000 篇文章,每篇文章有 200 词条,每个词条有6个字符,倒排记录数目是 1 亿。那么如果我们倒排索引表中单单记录文档id,不记录文档内的频率和偏移信息。 那么 文档id 的长度就必须是 l o g 2 800000 = 20 b i t log_2800000=20 bit l o g 2 ​ 800000 = 20 bi t (文档

    2024年02月12日
    浏览(46)
  • 分布式搜索引擎ElasticSearch——搜索功能

    DSL查询分类 DSL官方文档 全文检索查询 精确查询 地理查询 复合查询 Function Score Query function score query Boolean Query 排序 分页 官方文档 高亮 快速入门 match,term,range,bool查询 排序和分页 高亮显示 就是在前面抽取的解析代码中进一步添加关于高亮的解析部分,因为highlight和so

    2024年02月01日
    浏览(53)
  • 分布式搜索引擎——elasticsearch搜索功能

    Elasticsearch提供了基于JSON的DSL (Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有:查询出所有数据,一般测试用。例如:match_all 全文检索(full text)查询:利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如: match_query multi_match_query 精确查询:根据精确词条

    2024年02月05日
    浏览(64)
  • 【Go语言实战】(26) 分布式搜索引擎

    github地址:https://github.com/CocaineCong/tangseng 详细介绍地址:https://cocainecong.github.io/tangseng 这两周我也抽空录成视频发到B站的~ 本来应该10月份就要发了,结果一鸽就鸽到现在hhhh,有兴趣的同学也可留意一下~ gin作为http框架,grpc作为rpc框架,etcd作为服务发现。 总体服务分成

    2024年02月03日
    浏览(31)
  • Elasticsearch 搜索引擎

    一、创建索引库 *put* *http://localhost:9200/* *索引库名称* PUT http://localhost:9200/xc_course number_of_shards:设置分片的数量,在集群中通常设置多个分片,表示一个索引库将拆分成多片分别存储不同 的结点,提高了ES的处理能力和高可用性,入门程序使用单机环境,这里设置为1。 numb

    2024年02月01日
    浏览(44)
  • Elasticsearch全文搜索引擎

    Elasticsearch全文搜索引擎 Elasticsearch简介 windows平台下安装ES 学习ES的预备知识 ES索引操作 ES文档操作 ES高级查询 Golang操作ES起步 Golang操作ES索引 Golang操作ES文档 Golang ES高级查询 Gin集成ES

    2024年02月09日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包