GoDance搜索引擎——汇总篇 | 青训营笔记

315 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记

一、前言

为更好的完成大作业的需求,我们将其分成两块——支持分布式搜索的搜索引擎以及配套演示业务的搜索系统

二、GoDance分布式搜索引擎

GoDance是一款用go语言编写的分布式搜索引擎,同时也是一款分布式文档数据库。支持分布式搜索以及分布式存储功能,对外提供restful Api接口来操作GoDance。

GoDance整体采用主从架构,实现了Raft算法来保证元数据的一致,并有一系列机制比如tranlog、分片存储、分片迁移、故障转移等来保证集群的高可用和高拓展性;在路由方面,根据索引内存负载率和机器配置会优先路由效率高的分片节点,同时使用了rpcx来进行rpc调用;在搜索方面,实现了TF-IDF等搜索算法,并利用其实现了相关度搜索;在存储方面,利用了段的思想来提升搜索和插入的性能,同时支持正排索引(B+树)和倒排索引(BST和MAP)来提升搜索能力,并自己实现了相应的数据结构和Linux系统上的持久化机制(MMAP)。

分层架构图

数据存储示意图

大致思路与实现如下:

GoDance使用FST(Finite State Transducers)进行倒排索引的管理,使用 B+树数据库boltDB进行正排索引的管理,使用 Mmap 进行文档内容的读取。

段层将一个索引分为多个段,每个段独立拥有多个字段,支持多字段检索,多字段关键词过滤,同时支持日期筛选以及数值过滤。段分为内存段和磁盘段,内存段的倒排索引存储结构是HashMap,当段从内存段序列化为磁盘段后,就是只读的,读取过程采用 Mmap 进行。引擎会定时进行段的合并,在初始化引擎时启动一个 goroutine 检测段数,当段数过多时,会调用方法进行段合并,有些特别大的段不会参与合并。在段合并的时候,如果有文档被假删除,那么就会读取这些被删除文档的 id ,然后在合并时,将其跳过合并,就完成了对文档的真正删除。

搜索方面,GoDance在查询的时候会使用布尔模型将搜索词文档、筛选条件文档取∩交集,对过滤词取NOT补集,查找出所有相关文档。使用相关性评分函数使用TF-IDF算法、字段长度归一值BOOST、向量空间模型、协调因子实现对所有相关文档进行权重排序。

GoDance实时搜索与相关搜索用字典树(trie)实现,按照搜索词频次、长短依次排序。实时搜索是根据用户输入实时提示相关内容下拉框,内容<=10个。

分布式模块实现了Raft算法,支持节点水平拓展,在分布式条件下保证集群的高可用。利用种子节点机制实现了GoDance的自动发现功能。目前分布式模块正在陆续完善中,未来可以支持真正的分布式存储和分布式搜索功能,并做到真正的高可用

三、GoDance搜索系统(业务演示)

功能如下:

  • 支持用户的注册 、登录 、退出、销户
  • 实现收藏夹功能
  • 与GoDance搜索引擎交互实现搜索功能
  • 支持相关搜索
  • 搜索详情
  • 分页功能

技术实现:

  • 主要使用 jwt(token具体实现方法)用于监听用户登录状态,pbkdf2算法实现密码加密操作
  • 通过邮箱验证进行实名制
  • 通过mysql存储用户信息
  • redis存储用户收藏夹

(Bag 用于存放 用户的收藏夹 “我爱你” 则是具体的收藏夹)

user表的设计

四、团队分工协作

GoDance分布式搜索引擎——团队协作篇

五、模块详细设计与实现

搜索引擎模块设计与实现——集群模块

搜索引擎模块设计与实现——索引模块

搜索引擎模块设计与实现——相关度搜索算法模块

搜索引擎模块设计与实现——分片模块

搜索引擎模块设计与实现——业务模块

六、git仓库

追梦/GoDance(GoDance分布式搜索引擎)

逸达2024必上岸/GoDance(GoDance搜索系统)