使用 Go 语言与 Elasticsearch 实现高效搜索服务

使用 Go 语言与 Elasticsearch 实现高效搜索服务

什么是 Elasticsearch

  • Elasticsearch 是一个基于 Apache Lucene 构建的分布式搜索引擎,能够存储、搜索和分析大量数据。它具有高可扩展性、快速的搜索速度,支持全文检索、多字段查询和近实时数据分析。Elasticsearch 常与 Logstash 和 Kibana 一起构成 ELK 技术栈,广泛应用于日志分析、推荐系统和全文检索等领域。

安装 Elasticsearch

  • 下载并安装:你可以从 Elasticsearch 官网 下载适用于你操作系统的版本。
  • 启动 Elasticsearch:
./bin/elasticsearch
  • 验证安装:可以通过访问以下地址来验证 Elasticsearch 是否启动成功
http://localhost:9200/

Go 语言与 Elasticsearch 集成

  • 我们将使用 olivere/elastic 库,这是一个流行的 Go 语言客户端库,能够方便地与 Elasticsearch 交互。以下是实现的步骤:

安装 olivere/elastic 库

go get github.com/olivere/elastic/v7
  • 这个库支持 Elasticsearch 7.x 版本的所有功能,确保你的 Elasticsearch 版本兼容。

连接 es

import ("github.com/olivere/elastic/v7""testing"
)func TestClient(t *testing.T) {client, err := elastic.NewClient(elastic.SetSniff(false),elastic.SetURL("http://localhost:9200"),)if err != nil {panic(err)}t.Log(client)
}

go 操作索引

  1. 创建索引
import ("github.com/olivere/elastic/v7""testing"
)func TestIndexMapping(t *testing.T) {mapping := `{"settings" : {"number_of_shards" : 1,"number_of_replicas" : 1},"mappings":{"properties":{"nickname":{"type":"text"},"username":{"type":"keyword"},"id":{"type":"integer"},"create_at":{"type":"date","format":"[YYYY-MM-dd HH:mm:ss]"}}}}`//t.Log(mapping)client, err := elastic.NewClient(elastic.SetSniff(false),elastic.SetURL("http://localhost:9200"),)if err != nil {panic(err)}do, err1 := client.CreateIndex("user").BodyString(mapping).Do(context.Background())if err1 != nil {t.Logf("创建mapping失败%s", err1.Error())return}t.Log("创建mapping成功", do)}
  1. 判断索引是否存在

import ("github.com/olivere/elastic/v7""testing"
)func TestIndexExists(t *testing.T) {client, err := elastic.NewClient(elastic.SetSniff(false),elastic.SetURL("http://localhost:9200"),)if err != nil {panic(err)}do, err1 := client.IndexExists("user").Do(context.Background())if err1 != nil {panic(err1)}t.Log(do)
}
  1. 删除索引
import ("github.com/olivere/elastic/v7""testing"
)func TestDeleteIndex(t *testing.T) {client, err := elastic.NewClient(elastic.SetURL("http://localhost:9200"),elastic.SetSniff(false),)if err != nil {panic(err)}do, err1 := client.DeleteIndex("user").Do(context.Background())if err1 != nil {panic(err1)}t.Log(do)}

go 操作文档

  1. 添加文档
import ("github.com/olivere/elastic/v7""testing"
)type User struct {ID       uint      `json:"id"`Username string    `json:"username"`Nickname string    `json:"nickname"`CreateAt time.Time `json:"create_at"`
}func TestCreateDoc(t *testing.T) {user := &User{ID:       1,Username: "晓智科技",Nickname: "晓智",CreateAt: time.Now(),}client, err := elastic.NewClient(elastic.SetSniff(false),elastic.SetURL("http://localhost:9200"),)if err != nil {panic(err)}do, err1 := client.Index().Index("user").BodyJson(user).Do(context.Background())if err1 != nil {panic(err1)}t.Log(do)}
  1. 根据 id 删除
import ("github.com/olivere/elastic/v7""testing"
)func TestDeleteDoc(t *testing.T) {client, err := elastic.NewClient(elastic.SetSniff(false),elastic.SetURL("http://localhost:9200"),)if err != nil {panic(err)}deleteId := "7VKzh4sBP_UzlGBnhzrD"do, err1 := client.Delete().Index("user").Id(deleteId).Refresh("true").Do(context.Background())if err1 != nil {panic(err1)}t.Log(do)}
  1. 根据 id 批量删除
import ("github.com/olivere/elastic/v7""testing"
)
func TestBatchDeleteDocById(t *testing.T) {list := []string{"91LDh4sBP_UzlGBnwzpC", "9VLDh4sBP_UzlGBntjr8"}client, err := elastic.NewClient(elastic.SetSniff(false),elastic.SetURL("http://localhost:9200"),)if err != nil {panic(err)}bulk := client.Bulk().Index("user").Refresh("true")for _, s := range list {req := elastic.NewBulkDeleteRequest().Id(s)bulk.Add(req)}do, err1 := bulk.Do(context.Background())if err1 != nil {panic(err1)}t.Log(do.Succeeded())
}
  1. 批量添加
import ("github.com/olivere/elastic/v7""testing"
)func TestBatchCreate(t *testing.T) {list := []User{{ID:       12,Username: "张三",Nickname: "三",CreateAt: time.Now(),},{ID:       13,Username: "李四",Nickname: "阿四",CreateAt: time.Now(),},}client, err := elastic.NewClient(elastic.SetSniff(false),elastic.SetURL("http://localhost:9200"),)if err != nil {panic(err)}bulk := client.Bulk().Index("user").Refresh("true")for _, user := range list {doc := elastic.NewBulkCreateRequest().Doc(&user)bulk.Add(doc)}do, err1 := bulk.Do(context.Background())if err1 != nil {panic(err1)}t.Log(do.Created())
}

文档查询

  1. 分页查询
import ("github.com/olivere/elastic/v7""testing"
)// 查询文档
func TestFindDoc(t *testing.T) {client, err := elastic.NewClient(elastic.SetSniff(false),elastic.SetURL("http://localhost:9200"),)if err != nil {panic(err)}query := elastic.NewBoolQuery()res, err1 := client.Search("user").Query(query).From(0).Size(10).Do(context.Background())if err1 != nil {panic(err1)}count := res.Hits.TotalHits.Valuet.Log(count)for _, value := range res.Hits.Hits {t.Log(string(fmt.Sprintf("%d", value.Score)))}}
  1. 精确查询
import ("github.com/olivere/elastic/v7""testing"
)func TestFindTermDoc(t *testing.T) {client, err := elastic.NewClient(elastic.SetSniff(false),elastic.SetURL("http://localhost:9200"),)if err != nil {panic(err)}query := elastic.NewTermQuery("nickname", "晓智科技")res, err1 := client.Search("user").Query(query).From(0).Size(10).Do(context.Background())if err1 != nil {panic(err1)}count := res.Hits.TotalHits.Valuet.Log(count)for _, val := range res.Hits.Hits {t.Log(val.Source)}}
  1. 模糊查询
import ("github.com/olivere/elastic/v7""testing"
)// 模湖查询
func TestFinMathDoc(t *testing.T) {client, err := elastic.NewClient(elastic.SetSniff(false),elastic.SetURL("http://localhost:9200"),)if err != nil {panic(err)}query := elastic.NewMatchQuery("desc", "It从业人员")res, err1 := client.Search("user").Query(query).From(0).Size(10).Do(context.Background())if err1 != nil {panic(err1)}count := res.Hits.TotalHits.Valuet.Log(count)for _, val := range res.Hits.Hits {t.Log(string(val.Source))}
}
  1. 文档更新
import ("github.com/olivere/elastic/v7""testing"
)// 文档更新
func TestUpdateDoc(t *testing.T) {client, err := elastic.NewClient(elastic.SetSniff(false), elastic.SetURL("http://localhost:9200"))if err != nil {panic(err)}updateId := "8VLDh4sBP_UzlGBnlTqW"do, err1 := client.Update().Index("user").Id(updateId).Doc(map[string]any{"username": "晓晓智"}).Do(context.Background())if err1 != nil {panic(err1)}t.Log(do)
}

使用异步请求

  • 为了提高响应速度,可以使用异步请求处理搜索和索引操作。异步请求不会阻塞主线程,可以提高吞吐量。
client.Index().Index("products").BodyJson(product).DoAsync(context.Background(), func(response *elastic.IndexResponse, err error) {if err != nil {log.Printf("Error indexing document asynchronously: %s", err)} else {fmt.Printf("Asynchronous indexing completed for document %s\n", response.Id)}})

相关链接

演示地址
获取更多
源码地址

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

mysql/doris 计算两个时间相差n天n时n分示范

mysql/doris 计算两个时间相差n天n时n分示范 两个时间:so.create_time,so.update_time CONCAT(FLOOR(DATEDIFF(HOUR ,so.create_time,so.update_time)/24),天,DATEDIFF(HOUR ,so.create_time,so.update_time)%24,时,DATEDIFF(MINUTE ,so.create_time,so…

自动猫砂盆“智商税”还是“真香”?2024自动猫砂盆保姆级干货

平时忙着上班,或者一遇到出差就要离家四五天,没办法给毛孩子的猫砂盆铲屎,导致粪便堆积太久。很多铲屎官也了解到有自动猫砂盆这种东西,但是生怕是智商税,总觉得忍忍手铲也可以,要知道,猫咪的便…

如何在阿里云一键部署FlowiseAI

什么是FlowiseAI FlowiseAI 是一个开源的低代码开发工具,专为开发者构建定制的语言学习模型(LLM)应用而设计。 通过其拖放式界面,用户可以轻松创建和管理AI驱动的交互式应用,如聊天机器人和数据分析工具。 它基于Lang…

网络安全-Morpheus

NVIDIA Morpheus 文章目录 前言一、简介1. NVIDIA Morpheus 是什么?二、优势1. 深入了解 NVIDIA Morpheus 的优势高管借助全面的数据可见性,实时检测威胁利用生成式 AI 提高效率提升性能,降低成本开发者轻松开发和部署功能丰富,灵活性强实时遥测三、用例Morpheus 用例四、A…

通过观测云 DataKit Extension 接入 AWS Lambda 最佳实践

前言 AWS Lambda 是一项计算服务,使用时无需预配置或管理服务器即可运行代码。AWS Lambda 只在需要时执行代码并自动缩放。借助 AWS Lambda,几乎可以为任何类型的应用程序或后端服务运行代码,而且无需执行任何管理。 Lambda Layer 是一个包…

AI绘画,AI生成图片

分享一个可以免费使用的AI生成图片的网站: https://openart.aihttps://openart.ai/create 1、登陆后点击右上角create 2、在创建页面左侧输入描述文案,下面调整生成图片张数,点击create,右边即可生成 我这里输入了在吃麦当劳的超…

笔记||VUE3

侦听器 | Vue.js (vuejs.org) 模板引用 | Vue.js (vuejs.org)

Java初阶~~四种内部类总结

文章目录 1.内部类的分类2.局部内部类2.1.基本语法2.2就近原则的理解 3.匿名内部类3.1基于接口的匿名内部类3.2基于普通类的匿名内部类3.3基于抽象类的匿名内部类3.4匿名内部类的细节3.5匿名内部类实践3.5.1作为实参进行传递3.5.2实践案例 4.成员内部类4.1基本介绍4.2外部类&am…

api测试和接口测试的区别

API测试和接口测试是软件测试中一个非常重要的领域,尤其是在当前Web应用程序和移动应用程序的发展中。虽然它们都测试了Web服务的功能,但是二者在测试方法和测试实施方面存在很大的差异。本文将介绍API测试和接口测试之间的主要区别 API测试的主要关注点…

【LLM论文日更】| BGE经典论文-CPACK

论文:https://arxiv.org/pdf/2309.07597代码:GitHub - FlagOpen/FlagEmbedding: Retrieval and Retrieval-augmented LLMs机构:BAAI领域:embedding model发表:SIGIR 2024 ​ 研究背景 研究问题:这篇文章…

MySQL插入优化-性能对比

插入优化主要包括: 批量插入条数据,而不是单个记录逐条插入。手动提交事务,避免自动提交事务带来的额外开销。使用load命令从本地文件导入。 性能对比 创建数据库表 CREATE TABLE if not exists tb_sku ( id int(20) …

防汛可视化系统:提升应急响应能力

通过图扑可视化系统实时监测水情、雨情和地理数据,辅助防汛决策与调度,提供直观的风险预警信息,从而优化资源分配,提高防汛应急响应效率。

​​​​​​​如何使用LTX Studio生成故事插画

在这个科技飞速发展的时代,人工智能已经成为创意领域的重要工具。LTX Studio 是一个强大的平台,可以帮助你将文字故事生成精美的插画。以下是详细的步骤,教你如何使用LTX Studio 生成故事插画。 生成prompt、: 使用copilot实现&…

SD2.0 Specification之SD卡寄存器(Card Register)

文章目录 CID(Card IDentification)RCA(Relative Card Address)DSR(Driver Stage Register)CSD(Card-Specific Data)SCR(SD CARD Configuration Register)OCR(Operation Conditions Register)SSR(SD Status Register)CSR(Card Status Register) 本文章主要讲解SD2.0的各个卡寄存…

望繁信科技成功签约国显科技 流程挖掘助力制造业智造未来

近日,上海望繁信科技有限公司(简称“望繁信科技”)成功与深圳市国显科技有限公司(简称“国显科技”)达成合作。国显科技作为全球领先的TFT-LCD液晶显示及Mini/Micro LED显示产品供应商,致力于为笔记本、手机…

Linux云计算 |【第四阶段】RDBMS2-DAY4

主要内容: MHA概述、部署MHA集群 一、MHA概述 1、MHA简介 MHA(Master High Availability)是一款开源的MySQL的高可用程序,由日本DeNA公司youshimaton开发,是一套优秀的作为MySQL高可用性环境下故障切换和主从提升的…

Jenkins pipeline语法笔记

Jenkins pipeline 简介Jenkins Pipeline 优势DSL 是什么 pipeline支持两种语法:声明式pipeline语法:Pipelineagent Pipeline 声明式语法DeclarativeenvironmentoptionsparameterstriggerstoolsinputwhenParallel Pipeline Scripted语法流程控制Declarati…

罗永浩力荐格行随身WiFi,背后原因竟是...你绝对想不到!

一、罗永浩的“严选”哲学 虽然罗永浩做的是直播带货,但是他的形象与其他头部主播之间有着明显的不同。那些头部主播,都可以统称为“电商主播”,他们与那些淘宝店、京东店里直播的商家本质是一样的,只有流量和名气大小不同罢了。…

SpringBoot开发部署(热部署+常规部署+Docker部署)

开发热部署 SpringBoot模板引擎的页面默认是开启缓存的,如果修改了页面,则刷新页面是得不到修改后的页面的 在application.properties中关闭模板引擎缓存 Thymeleaf spring.thymeleaf.cachefalseFreeMarker spring.freemarker.cachefalseGroovy spring…

拓扑排序与入度为0的结点算法解析及实现

拓扑排序与入度为0的结点算法解析及实现 算法思想时间复杂度分析伪代码C语言实现环路检测结论拓扑排序是一种用于有向无环图(DAG, Directed Acyclic Graph)的重要操作,它可以对图中的结点进行排序,使得对于每一条有向边 (u, v),顶点 u 在排序中都出现在顶点 v 之前。本文介…