Golang与Elasticsearch搭配检索运用

golang分布式中间件之ElasticSearch 在本文中,我们将介绍如何使用Go语言来实现ElasticSearch分布式中间件,并探讨ElasticSearch的一些核心概念和特性。go-elasticsearch是一个基于Elasticsearch官方客户端库开发的开源库,提供了简单、高效的Elasticsearch客户端实现。每个索引都包含多个文档,而文档则是索引中的最小存储单元。集群由一个唯一的名称来进行标识,节点可以在不同的物理服务器上,也可以在同一台机器上运行。然后,我们使用es.Index方法将其添加到指定的索引中,并指定了该文档的ID。 阅读详情

一、简介下:

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做异步同步
原创作者: ggtop 转载于: https://www.cnblogs.com/ggtop/p/18901426
在CSDN学Golang分布式中间件(ElasticSearch 倒排索引是一种用于快速查找文本中特定单词或短语的数据结构。它将文本中的每个单词或短语包含该单词或短语的文档列表相关联。这使得可以轻松地查找包含给定单词或短语的所有文档。在 Go 中,可以使用 map 和 slice 来实现倒排索引。具体来说,可以使用一个 map 将每个单词映射到包含该单词的文档列表。这样就可以通过检索特定单词来获取包含该单词的所有文档。另一方面,Lucene 是一个全文搜索引擎库,可用于建立更高效和更复杂的倒排索引。 阅读详情

相关推荐

RTX4090上跑CenterNet训练

参考实现 url=https://github.com/xingyizhou/CenterNet.git commit_id=5b1a490a52da57d3580e80b8bb4bbead9ef2af96

遗失的神庙 1598

golang elasticsearch入门教程

golang elasticsearch入门教程目前golang操作elasticsearch的第三方包中最流行的是:https://github.com/olivere/elastic本教程也是基于elastic开发包进行讲解。版本说明golang的elastic开发包和elasticsearch版本有一些对应关系,在开发前需要注意下,必须选择正确的版本,下面是golang elastic开发包...

lxw1844912514的博客 2611

IEC104协议学习专栏内容规划

IEC104协议的编程学习

sixtome 1086

golang中使用elasticsearch

本文首发于我的个人博客 这是一篇介绍如何利用golang第三方库https://github.com/olivere/elastic进行elasticsearch的操作的文章。 文章中并不会介绍非常详细的API,更侧重于作者在工作中的使用经验和查文档经验。文章中主要包括以下内容: 作者认为比较重要的API设计理念以及文档查阅方式 作者在工作中使用到的elasticsearch的实例,包括从接到需求,查阅文档,并实现的过程 API设计理念思考 API的分类 在使用elasticsearchgolang

fitzleopard的博客 2327

golang入门笔记—ES

ES参考网站 ES的介绍: Elasticsearch(ES)是一个基于Lucene构建的开源、分布式、RESTful接口的全文搜索引擎。Elasticsearch还是一个分布式文档数据库,其中每个字段均可被索引,而且每个字段的数据均可被搜索,ES能够横向扩展至数以百计的服务器存储以及处理PB级的数据。可以在极短的时间内存储、搜索和分析大量的数据。通常作为具有复杂搜索场景情况下的核心发动机。 ES的基本概念: 1.当你经营一家网上商店,你可以让你的客户搜索你卖的商品。在这种情况下,你可以使用Elastic

qq_43716830的博客 3696

1999-2024年 上市公司-微观企业劳动力生产率数据(数据+代码+文献)

微观企业劳动生产率(Labor Productivity at the Firm Level)指单位劳动投入所创造的产出价值,反映企业将劳动力要素转化为经济产出的效率。本数据借鉴牛志伟(2023),用企业人均营业收入的对数值测度企业劳动生产率。参照李广众(2018),以“(销售收入 + 存货变动)/员工人数”取对数来测度企业劳动生产率。数据包含原始数据、参考文件、代码do、最终结果。三、参考文献:[1]牛志伟,许晨曦,武瑛.营商环境优化、人力资本效应企业劳动生产率[J].管理世界,2023,39(02):83-100.[2]李广众,叶敏健,郑颖.资本结构员工劳动生产率[J].管理科学学报,2018,21(02):1-15.相关数据代码 年份 行业代码 行业名称 STPT 金融业 A001123000 B001101000 Y0601b Symbol 简称 省份代码 省份 城市代码 城市 labprod1 labprod2

上一篇: 2025年BI工具趋势:DataFocus与FineBI的技术创新对比
下一篇: 《数据资产管理核心技术与应用》读书笔记- 第六章-数据监控与告警(一)
玄玖爷
博客等级 码龄9年 31粉丝 · 79原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值