搜索引擎开发(一)基本概念 | 青训营笔记

212 阅读2分钟

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

搜索引擎初步设计

Search.png

文档

文档可以是的形式多种多样,总之就是需要被检索的内容

索引构建器

索引构建器的功能是:从给定的文档中生成索引

索引构建器会将文档分词,然后将单词序列转换成索引结构

可以使用 post 请求发送一个 JSON 给服务器用于创建索引:

 {
   "id": 1,
   "text": "南昌大学数学与计算机学院",
   "title": "南昌大学简介",
 }

这里的 ID 可以尝试用 id 生成器生成,要保证不重复,可以考虑 雪花算法

发送请求之后,text 会被分成:

分词结果.png

然后将每个词以及它对应的 id 插入 索引树

如果词已经存在,则将 id 插入对应的词的映射 中

索引检索器

利用索引进行全文搜索,对结果进行相关性排序以及分页

对搜索的文本进行分词,然后对每个词进行搜索

对查找到的文档使用 TF-IDF 算法 进行相关性排序

具体:发送 post 请求

 {
   "query":"南昌计算机",
   "page":1,   // 分页
   "limit":10,
   "order": "desc" // 排序方式
 }

搜索引擎将 query 分成 [南昌,计算机]

然后将这两个单词都进行检索,找到对应的 文档id ,再去查找 文档id 和 文档的映射

最后返回的文档进行相关性排序

文档管理器

一般结构是 ID + 文档内容,可以使用 KV 数据库实现该功能,比如 level DB

索引管理器(核心)

索引管理器的功能是管理索引结构,能做到快速查找

索引管理器的内容包括:正排索引+倒排索引, 可以抽象成 词典+倒排文件

这里看词典是连续的,其实应该是树形结构,便于查找

Search2.png

词典中存储的就是所有的关键词,倒排列表就是对应的文档 ID,我们通过文档ID 就可以去数据库查询文档

比如我要搜索: 我来到北京清华大学

假设索引检索器首先将这句话分词成:我、来到、北京、清华大学,然后就会去索引管理器中查找包含这几个关键词的索引

倒排索引:可以由平衡二叉树 / B+树 等实现,每一个结点内容是:关键词和对应的文档ID (存的是ID在文件中的偏移量)

下图 ref 就是文档 ID

Search1.png

在树上找到对应的关键词后,通过文档 ID,找到文档后返回给用户

这里应该是两个映射:

倒排索引: key:关键词, value: ref

文档仓: key: ref, value: 文档