搜索引擎开发(二)存储部分设计 | 青训营笔记

170 阅读2分钟

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

存储部分设计

我们的搜索引擎分了很多模块,如下图所示

架构图.png

存储部分主要就是对分片层,段层,字段层以及正排索引和倒排索引的设计

分片层

分片层就是对索引以及索引分片的管理,主要提供的方法就是新建一个索引,序列化和反序列化索引,新增和删除字段,新增和删除文档,查找文档,合并和序列化段等

段层

段是为了减少大规模磁盘IO而提出的,段只要持久化到磁盘之后就不会发生变化,如果要删除段中的文档,可以用一个 .del 文件记录,然后在段合并的时候进行删除

段分为内存段和磁盘段,插入新的文档只能在内存插入,内存段用一个 HashMap 存储倒排索引,磁盘段的读取则是通过 Mmap 进行,这样能保证一定的搜索速度

字段层

字段记录了该索引内部的文档有哪些属性,比如标题,正文,作者,日期等,根据不同的字段类型,可以决定是否要建立倒排索引或者是正排索引

比如字符串类型大部分是要建立倒排索引的,如果是日期类型,就可以考虑建立正排索引,就可以做到快速过滤

倒排索引

对一些字符串类型的数据,可以考虑分词,将其加入倒排索引,这样就能在搜索内容时快速返回有该内容的文档集合,我们的倒排索引选用了 FST(Finite State Transducer),FST 可以公用关键词的前缀和后缀,达到快速检索的效果

后期可以考虑加入缓存机制,加快倒排索引的检索速度

正排索引

对日期,数值类型的数据,如果要做范围过滤,如果能有个正排索引进行过滤效果应该会更好,所以我们采用B+树为底层的KV数据库BoltDB进行了实现

文档仓

对文档内容的存储采用了文件存储的形式,对文档内容的读取采用 Mmap 方式

后期可以考虑加入缓存机制,加快读取速度