【Go语言实战】(26) 分布式搜索引擎

这篇具有很好参考价值的文章主要介绍了【Go语言实战】(26) 分布式搜索引擎。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Tangseng 基于Go语言的搜索引擎

github地址:https://github.com/CocaineCong/tangseng

详细介绍地址:https://cocainecong.github.io/tangseng

这两周我也抽空录成视频发到B站的~ 本来应该10月份就要发了,结果一鸽就鸽到现在hhhh,有兴趣的同学也可留意一下~

项目大体框架

  1. gin作为http框架,grpc作为rpc框架,etcd作为服务发现。
  2. 总体服务分成用户模块收藏夹模块索引平台搜索引擎(文字模块)搜索引擎(图片模块)。注册到etcd中,并进行服务发现。
  3. 分布式爬虫爬取数据,并发送到kafka集群中,再落库消费。现阶段使用数据集文本输入 (虽然爬虫还没写,但不妨碍我画饼…)
  4. 搜索引擎模块的文本搜索单独设立使用boltdb存储index,mapreduce+kafka集群加速索引构建并使用roaring bitmap存储索引。
  5. 使用 trie tree 实现词条联想。
  6. 图片搜索使用ResNet50来进行向量化查询 + Milvus or Faiss 向量数据库的查询 (开始做了… DeepLearning也太难了…)。
  7. 支持多路召回,go中进行倒排索引召回,python进行向量召回。通过grpc调用连接,进行融合。
  8. 支持TF-IDF,BM25等等算法排序。
  9. 第三方容器纯docker拉取启动。

go 搜索引擎,遇见Golang,拥抱未来,golang,分布式,搜索引擎

🧑🏻‍💻 前端地址

all in react, but still coding react-tangseng

由于我真的不怎么会写前端,前端大佬别骂了…这里就放两个页面…

搜索页面
go 搜索引擎,遇见Golang,拥抱未来,golang,分布式,搜索引擎
搜索结果页面

go 搜索引擎,遇见Golang,拥抱未来,golang,分布式,搜索引擎

🌈 项目主要功能

1. 用户模块

  • 登录注册

2. 收藏夹模块

  • 创建/更新/删除/展示 收藏夹
  • 将搜索结果的url进行收藏夹的创建/删除/展示

3. 索引平台

3.1 文本存储

正排库

目前存放在mysql中,但后续会放到OLAP,starrocks可以承受单表亿级数据毫秒级查询,像mysql这种OLTP到这个级别早就分库分表了,不然这张表或者这个库就废了,索引页也救不活…

倒排库

x.inverted 存储倒排索引文件
x.trie_tree 存储词典trie树

目前使用 mapreduce+kafka 集群 来构建倒排索引

go 搜索引擎,遇见Golang,拥抱未来,golang,分布式,搜索引擎

  • map任务将数据拆分以下形式
{
  "token":"xxx",
  "doc_id":1
}
  • reduce任务将所有相同 token 的 doc_id 合并在一起

存储doc id使用roaring bitmap这种数据结构来存储,尽可能的压缩空间

在索引平台中,离线构建的倒排索引会进行合并操作

  • 每天产生的数据将存放同一个文件中. eg: 2023-10-03.inverted
  • 每周的周日会将这一周的数据都合并到当月中. eg: 2023-10.inverted
  • 每月的最后一天会把该月合并到该季度中. eg: 2023-Autumn.inverted
向量库

向量库采用milvus来存储向量信息,这部分逻辑是放在python的,因为文本向量化基本都是python垄断

4. 搜索模块

4.1 文本搜索

  • 倒排召回

因为 boltdb 是kv数据库,所以直接获取所有的对应的query对应的 doc id 即可,这部分使用的是golang实现的,并提供了grpc接口。

  • 向量召回

query向量化,并从milvus中查询获取,这部分使用的python实现,并提供了grpc接口。

  • 融合

将倒排和向量两个纬度的索引信息召回进行融合。

  • 排序

bm25进行排序

4.2 图片搜索(待定…)

  • resnet50 模型召回

go 搜索引擎,遇见Golang,拥抱未来,golang,分布式,搜索引擎

✨ 项目结构

1.tangseng 项目总体

tangseng/
├── app                   // 各个微服务
│   ├── favorite          // 收藏夹
│   ├── gateway           // 网关
│   ├── index_platform    // 索引平台
│   ├── mapreduce         // mapreduce 服务(已弃用)
│   ├── gateway           // 网关
│   ├── search_engine     // 搜索微服务(文本)
│   ├── search_vector     // 向量搜索微服务(图片+向量)
│   └── user              // 用户模块微服务
├── bin                   // 编译后的二进制文件模块
├── config                // 配置文件
├── consts                // 定义的常量
├── doc                   // 接口文档
├── idl                   // protoc文件
│   └── pb                // 放置生成的pb文件
├── loading               // 全局的loading,各个微服务都可以使用的工具
├── logs                  // 放置打印日志模块
├── pkg                   // 各种包
│   ├── bloom_filter      // 布隆过滤器
│   ├── clone             // 复制context,防止context cancel
│   ├── ctl               // 用户信息相关
│   ├── discovery         // etcd服务注册、keep-alive、获取服务信息等等
│   ├── fileutils         // 文件操作相关
│   ├── es                // es 模块
│   ├── jwt               // jwt鉴权
│   ├── kfk               // kafka 生产与消费
│   ├── logger            // 日志
│   ├── mapreduce         // mapreduce服务
│   ├── res               // 统一response接口返回
│   ├── retry             // 重试函数
│   ├── timeutil          // 时间处理相关
│   ├── trie              // 前缀树
│   ├── util              // 各种工具、处理时间、处理字符串等等..
│   └── wrappers          // 熔断
├── repository            // 放置打印日志模块
│   ├── mysql             // mysql 全局数据库
│   ├── redis             // redis 全局数据库
│   └── vector            // 向量数据库
└── types                 // 定义各种结构体

2.gateway 网关部分

gateway/
├── cmd                   // 启动入口
├── internal              // 业务逻辑(不对外暴露)
│   ├── handler           // 视图层
│   └── service           // 服务层
│       └── pb            // 放置生成的pb文件
├── logs                  // 放置打印日志模块
├── middleware            // 中间件
├── routes                // http 路由模块
└── rpc                   // rpc 调用

3.user && favorite 用户与收藏夹模块

user/
├── cmd                   // 启动入口
└── internal              // 业务逻辑(不对外暴露)
    ├── service           // 业务服务
    └── repository        // 持久层
        └── db            // db模块
            ├── dao       // 对数据库进行操作
            └── model     // 定义数据库的模型

4. index platform索引平台

seach-engine/
├── analyzer              // 分词器
├── cmd                   // 启动入口
├── consts                // 放置常量
├── crawl                 // 分布式爬虫
├── input_data            // csv文件(爬虫未实现)
├── respository           // 存储信息
│   ├── spark             // spark 存储,后续支持...
│   └── storage           // boltdb 存储(后续迁到spark)
├── service               // 服务
└── trie                  // 存放trie树

5.search-engine 搜索引擎模块

seach-engine/
├── analyzer              // 分词器
├── cmd                   // 启动入口
├── data                  // 数据层
├── ranking               // 排序器
├── respository           // 存储信息
│   ├── spark             // spark 存储,后续支持...
│   └── storage           // boltdb 存储(后续迁到spark)
├── service               // 服务
├── test                  // 测试文件
└── types                 // 定义的结构体

这里只是对tangseng的简单介绍而已~,具体可以查看github链接 tangseng搜索引擎

另外lotusdblabs 社区也开源了一个 lotusearch 搜索引擎,有兴趣同学可以瞅瞅~文章来源地址https://www.toymoban.com/news/detail-770759.html

到了这里,关于【Go语言实战】(26) 分布式搜索引擎的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 分布式搜索引擎--认识

    分布式搜索引擎--认识

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

    2024年01月18日
    浏览(13)
  • 【分布式搜索引擎02】

    elasticsearch的查询依然是基于JSON风格的DSL来实现的。 Elasticsearch提供了基于JSON的DSL(Domain Specific Language)来定义查询。常见的查询类型包括: 查询所有 :查询出所有数据,一般测试用。例如:match_all 全文检索(full text)查询 :利用分词器对用户输入内容分词,然后去倒排索

    2024年02月01日
    浏览(18)
  • 【分布式搜索引擎03】

    【分布式搜索引擎03】

    **聚合(aggregations)**可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这些统计功能的比数据库的sql要方便的多,而且查询速度非常快,可以实现近

    2024年02月05日
    浏览(25)
  • 【分布式搜索引擎elasticsearch】

    【分布式搜索引擎elasticsearch】

    什么是elasticsearch? 一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、分析、系统监控等功能 什么是elastic stack(ELK)? 是以elasticsearch为核心的技术栈,包括beats、Logstash、kibana、elasticsearch elasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK)。被广泛应用在

    2024年02月10日
    浏览(23)
  • 分布式搜索引擎----elasticsearch

    分布式搜索引擎----elasticsearch

    目录 1、初识elasticsearch 1.1、什么是elasticsearch 1.2.ELK技术栈 2、正向索引和倒排索引 2.1、正向索引 2.2、倒排索引 2.3、正向索引和倒排索引的区别 3、elasticsearch中的概念理解 3.1、文档和字段 3.2、索引和映射 3.3、mysql与elasticsearch         elasticsearch是一款非常强大的开源搜索

    2024年02月11日
    浏览(39)
  • 【分布式搜索引擎es】

    【分布式搜索引擎es】

    elasticsearch最擅长的是 搜索 和 数据分析 。 查询文档 常见的查询类型包括: 查询所有 :查询出所有数据,一般测试用。例如:match_all 全文检索(full text)查询 :利用分词器对用户输入内容分词,然后去倒排索引库中匹配。例如: match_query multi_match_query 精确查询 :根据精确

    2024年02月10日
    浏览(11)
  • 分布式搜索引擎ES

    分布式搜索引擎ES

    elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 例如: 在GitHub搜索代码 在电商网站搜索商品 在百度搜索答案 ELK技术栈 elasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK)。被广泛应

    2024年02月04日
    浏览(15)
  • ElasticSearch分布式搜索引擎

    ElasticSearch分布式搜索引擎

    KuangStudy ElasticSearch学习视频:狂神说ElasticSearch教程 1、官网 Elaticsearch ,简称为es,es是一个开源的 高扩展 的 分布式全文检索引擎 ,它可以近乎 实时的存储 、 检索数据; 本身扩展性很好,可以扩展到上百台服务器,处理PB级别(大数据时代)的数据。es也使用java开发并使用

    2024年02月16日
    浏览(13)
  • 分布式搜索引擎ElasticSearch——基础

    分布式搜索引擎ElasticSearch——基础

    什么是elasticsearch elasticsearch的发展 https://lucene.apache.org/ https://www.elastic.co/cn/ 正向索引和倒排索引 安装elasticsearch,kibana https://github.com/medcl/elasticsearch-analysis-ik 部署单点es 创建网络 因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先创建一个网络: 加载镜像

    2024年01月17日
    浏览(18)
  • 分布式搜索引擎-elasticsearch基础

    分布式搜索引擎-elasticsearch基础

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

    2024年03月20日
    浏览(15)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包