一、简介下:

Elasticsearch 是一个高性能、分布式、全文搜索与分析引擎,它的核心优势在于 对结构化和非结构化数据进行高效搜索、统计与分析,远远超出传统关系数据库(如 MySQL)的全文检索能力。

让你能在海量数据中,毫秒级地进行智能搜索和实时分析。

核心模块:全文检索、结构化查询、聚合分析、实时写入/搜索、分布式扩展、高可用性、可视化分析。

常见应用场景 :博客/文档搜索、电商搜索推荐、日志分析、指标分析、审计等

二、运用(举例博客系统中)

      用户写博客

API Server (Golang)

数据写入 MySQL 数据库

同步写入 Elasticsearch

1)Blog 模型(models/blog.go)

type Blog struct {
ID int64 `gorm:"primaryKey" json:"id"`
Title string `json:"title"`
Content string `json:"content"`
Tags string `json:"tags"` // JSON string
Author string `json:"author"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}

2)写入博客(MySQL + Elasticsearch 同步)

️services/blog_service.go

func CreateBlog(blog *models.Blog) error {
if err := db.Create(blog).Error; err != nil {
return err
}
return elastic.IndexBlog(blog) // 同步到 ES
}
func UpdateBlog(blog *models.Blog) error {
if err := db.Save(blog).Error; err != nil {
return err
}
return elastic.IndexBlog(blog) // 重新索引
}
func DeleteBlog(blogID int64) error {
if err := db.Delete(&models.Blog{}, blogID).Error; err != nil {
return err
}
return elastic.DeleteBlog(blogID)
}

️elastic/client.go

var es *elasticsearch.Client

func InitES() {
cfg := elasticsearch.Config{Addresses: []string{"http://localhost:9200"}}
//搭配pwd使用 :
//cfg := elasticsearch.Config{Addresses: []string{eshost}, Username: esname,Password: espwd}
client, err := elasticsearch.NewClient(cfg)
if err != nil {
log.Fatalf("ES init error: %v", err)
}
es = client
} func IndexBlog(blog *models.Blog) error {
body, _ := json.Marshal(blog)
req := esapi.IndexRequest{
Index: "blogs",
DocumentID: strconv.FormatInt(int64(blog.ID), 10),
Body: bytes.NewReader(body),
Refresh: "true",
}
res, err := req.Do(context.Background(), esct)
if err != nil {
return err
}
defer res.Body.Close()
return nil
}
func DeleteBlog(blogID int64) error {
req := esapi.DeleteRequest{
Index: "blogs",
DocumentID: fmt.Sprintf("%d", blogID),
Refresh: "true",
}
res, err := req.Do(context.Background(), esct)
if err != nil {
return err
}
defer res.Body.Close()
return nil
}

引入官方库

go get github.com/elastic/go-elasticsearch/v8

3)数据流转方式

            用户访问 Web/前端

┌─────────▼──────────┐
│ Golang 后端服务 │
└─────────┬──────────┘

┌──────────┼────────────┐
│ │
▼ ▼
MySQL 关系型数据库 Elasticsearch 搜索引擎
️ 存储结构化数据 存储可检索文档数据
- title - title(分词)
- content - content(分词 + 高亮)
- created_by - 拼音/模糊匹配
- tag_id 等业务字段 - 自定义字段聚合、排序

4)搜索实现

type BlogHit struct {
ID string `json:"id"`
Source map[string]interface{} `json:"source"`
}
// 搜索博客(支持标题和内容)
func SearchBlogs(keyword string) ([]BlogHit, error) {
query := fmt.Sprintf(`
{
"query": {
"multi_match": {
"query": "%s",
"fields": ["title", "content"]
}
},
"highlight": {
"fields": {
"title": {},
"content": {}
}
}
}`, keyword)
res, err := es.Search(
esct.Search.WithContext(context.Background()),
esct.Search.WithIndex("blogs"),
esct.Search.WithBody(strings.NewReader(query)),
esct.Search.WithTrackTotalHits(true),
esct.Search.WithPretty(),
)
if err != nil {
return nil, err
}
defer res.Body.Close()
if res.IsError() {
return nil, fmt.Errorf("error response from ES: %s", res.String())
}
var r struct {
Hits struct {
Hits []struct {
ID string `json:"_id"`
Source map[string]interface{} `json:"_source"`
} `json:"hits"`
} `json:"hits"`
}
if err := json.NewDecoder(res.Body).Decode(&r); err != nil {
return nil, err
}
var results []BlogHit
for _, hit := range r.Hits.Hits {
results = append(results, BlogHit{
ID: hit.ID,
Source: hit.Source,
})
}
return results, nil
}

IKSSr">可视化执行逻辑图如下

[ 用户输入关键词 "golang" ]

[ Vue 前端 ]

/search/blog?q=golang

[ Golang 后端调用 ES 查询 + 高亮]

[ Elasticsearch 返回文档列表 ]

[ Vue 展示博客标题 + 摘要 + 图片 ]

前端调取方式如下

//vue调用golang api
axios({
method: "get",
url: "http://127.0.0.1:2023/GetSearchBlogs?title="+event,
})
.then((res) => {
if(res.data.data.lists==null){
//ElMessage.error("没有相关记录")
searchcount.value=0
blogData.values=[]
return
}else{
searchcount.value=res.data.lists.length
blogData.values=res.data.lists
}
})

三、效果演示

 

四、更多可扩展性

  • 搜索智能:模糊匹配、同义词、拼写纠错、词根分析
  • 实时统计:统计聚合性能强(如 PV、UV、热词排行)
  • 多语言支持:内置中文、英文、日文等分词器(可使用 IK、jieba 等)
  • 高并发场景:使用 Kafka 或rabbitmq做异步同步

Golang与Elasticsearch搭配检索运用的更多相关文章

  1. Elasticsearch原理学习--为什么Elasticsearch/Lucene检索可以比MySQL快?

    转载于:http://vlambda.com/wz_wvS2uI5VRn.html 同样都可以对数据构建索引并通过索引查询数据,为什么Lucene或基于Lucene的Elasticsearch会比关系 ...

  2. ElasticSearch进阶检索

    ElasticSearch进阶检索 入门检索中讲了如何导入elastic提供的样本测试数据,下面我们用这些数据进一步检索 一.SearchAPI ES 支持两种基本方式检索 : 1.一种是通过使用 R ...

  3. 分布式搜索elasticsearch 文献检索索引 入门

    1.首先,例如,下面的数据被提交给ES该指数 {"number":32768,"singer":"杨坤","size": ...

  4. 搭建ElasticSearch+MongoDB检索系统

    ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apach ...

  5. ES 19 - Elasticsearch的检索语法(_search API的使用)

    目录 1 Search API的基本用法 1.1 查询所有数据 1.2 响应信息说明 1.3 timeout超时机制 1.4 查询多索引和多类型中的数据 2 URI Search的用法 2.1 GET ...

  6. ElasticSearch入门检索

    前面简介说到 elsatic是通过RestFul API接口操作数据的,可以通过postman模拟接口请求测试一下 一._cat 1.GET /_cat/nodes:查看所有节点 2.GET /_ca ...

  7. Elasticsearch高级检索之使用单个字母数字进行分词N-gram tokenizer(不区分大小写)【实战篇】

    一.前言 小编最近在做到一个检索相关的需求,要求按照一个字段的每个字母或者数字进行检索,如果是不设置分词规则的话,英文是按照单词来进行分词的. 小编以7.6.0版本做的功能哈,大家可以根据自己的版本去 ...

  8. golang基础- ElasticSearch搜索引擎、kibana可视化工具、向ES输出数据

    转载自:https://blog.csdn.net/u013210620/article/details/78647366 安装ElasticSearch ElasticSearch是一个基于Luce ...

  9. elasticsearch 拼音检索能力研究

    gitchennan/elasticsearch-analysis-lc-pinyin 配置参数少,功能满足需求. 对应版本 elasticsearch2.3.2 对应 elasticsearch-a ...

  10. ElasticSearch 分页检索

    在ElasticSearch的多索引和多类别里说到我们在集群中有14个文档匹配我们的(空)搜索语句.单数仅仅有10个文档在hits数组中.我们怎样看到其它文档? 和SQL使用LIMITkeyword返 ...

随机推荐

  1. Vue3组件通信全攻略:多种方式详解+实战场景,轻松玩转复杂数据流!

    一.组件通信为何如此重要? 在大型Vue项目中,组件通信如同神经网络般贯穿整个应用.良好的通信机制能: 实现组件解耦 提升代码可维护性 构建清晰数据流 支撑复杂业务场景 二.父子组件通信:核心通信模式 ...

  2. C# 超大数据量导入 SqlBulkCopy

    1 public static void ImportTempTableDataIndex(DataSet ds,string TempTableName,string strSqlConnectio ...

  3. 『Python底层原理』--GIL对多线程的影响

    在 Python 多线程编程中,全局解释器锁(Global Interpreter Lock,简称 GIL)是一个绕不开的话题. GIL是CPython解释器的一个机制,它限制了同一时刻只有一个线程可 ...

  4. 机器人技术的突破让OpenAI过时了

    机器人技术的突破让OpenAI过时了 Ignacio de Gregorio 最近,Figure AI,一家价值数十亿美元的AI机器人公司,宣布取消与OpenAI的合作伙伴关系,这一举动看起来是相当大 ...

  5. Web前端入门第 8 问:HTML <!DOCTYPE> 申明有何用处?如果没有此申明有什么问题?

    HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 先电脑端浏览器打开任何一个网页,比如百度. 再用 ctrl + u 快捷键即可查看源码,瞅瞅第一行代码,是不是都 ...

  6. go 限流器 rate

    前言 Golang 官方提供的扩展库里就自带了限流算法的实现,即 golang.org/x/time/rate.该限流器也是基于 Token Bucket(令牌桶) 实现的. 限流器的内部结构 tim ...

  7. Centos安装完成后,ifconfig:command not found

    1.问题:在刚最小安装完centos7,想查看本机IP地址.然后运行ifconfig,结果弹出报错. 2.问题排查:首先我们了解是不是没有开启网卡导致的?我们可以通过一下3种方法来排查: 1)通过pi ...

  8. 人工智能-A*算法-八数码问题

    一,A*算法设计思想 A*算法(A-star)是一种寻路算法,主要用于游戏.机器人等领域. 它的设计思想是将最短路径搜索问题转化为一个优化问题,通过计算每个节点的评分(f(n) = g(n) + h( ...

  9. Django实战项目-学习任务系统-兑换物品管理

    接着上期代码框架,开发第5个功能,兑换物品管理,再增加一个学习兑换物品表,主要用来维护兑换物品,所需积分,物品状态等信息,还有一个积分流水表,完成任务奖励积分,兑换物品消耗积分. 要想激励一个人的学习 ...

  10. 通过 openpyxl 操作 excel 表格

    博客地址:https://www.cnblogs.com/zylyehuo/ STEP1: 导入相关库 import os from openpyxl import load_workbook STE ...