这是我参与「第三届青训营 -后端场」笔记创作活动的第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表的设计
四、团队分工协作
五、模块详细设计与实现
六、git仓库
追梦/GoDance(GoDance分布式搜索引擎)
逸达2024必上岸/GoDance(GoDance搜索系统)