这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记
搜索引擎项目设计(概念理解和设计思路)|青训营笔记
项目的设计目标
- 使用go语言编写分布式搜索引擎,主要提供文档的全文搜索,对外提供restful Api接口来实现搜索和增加文档的操作
- 项目不仅支持全文搜索功能,还提供筛选和过滤的功能
- 通过算法对搜索结果进行排序,保证搜索结果的高质量
- 支持分布式的集群部署
基本概念
几个关于搜索引擎的概念
文档,搜索引擎的基本数据单元,比如一张网页,一个商品,多个文档合在一起就是一个搜索引擎的完整数据倒排索引,正排索引,是存储在搜索引擎内部的最底层的数据结构。字段,每个文档可能有多个字段,比如一篇文章有标题,作者,摘要,详情,发布时间的,这些东西虽然在一个文档中,但是搜索的时候需要区别对待。索引,多个文档通过索引器生成了一堆倒排正排索引,我们把这些倒排正排索引的集合叫索引,如果后面提到索引就是指正排和倒排索引的集合,索引也可以理解为数据库中的表。
项目分层
1. 网络层
和外界进行交互,提供增删改查的接口
2. 引擎层
实现具体的业务查找逻辑
-
增 增量索引构建. 增加数据的时候就是将一条一条上文中的原始数据导入到搜索引擎中,每增加一条数据会先在内存中增加数据,然后达到一定条件以后将一批数据写入到段文件中,并且达到一定条件以后会将各个段合并起来。
-
删 bitmap的基本运算是位运算,先屏蔽..然后定期物理删除
-
改 先删再增就是改了
-
查 先对搜索关键词进行分词..调用索引管理层对关键字进行数据检索 开始进行倒排检索了,倒排检索就是按照切词的结果,一个term一个term的从倒排文件中拉取倒排链 单term多字段间求并 多term之间求交
对屏蔽词构建文档集合,与搜索结果求补集
调用正排索引进行搜索结果的过滤
调用算法对结果进行排序然后返回给客户端
3.段层
基本概念
所谓段,就是最基本的检索系统,一个段包含所有字段,包含一部分连续的文档集合,能够进行完整的检索,可以把它当成一个检索系统最基本单位。 多个段合在一起就是一个完整的索引,检索的时候实际上是每个段单独检索,然后把数据合并起来就是最后的结果集了。
作用
有增量数据: 新增的数据首先在内存中进行保存,然后周期性的生成一个段,持久化到磁盘中提供检索操作
段还有一个好处就是当系统是一个分布式的系统的时候,进行索引同步的时候,因为各个段持久化以后就不会变化了,只需要把段拷贝到各个机器,就可以提供检索服务了,不需要在各个机器上重建索引
一个段损坏了,并不影响其他段的检索,只需要从其他机器上将这个段拷贝过来就能正常检索了,如果只有一个索引的话,一旦索引坏了,就无法提供检索服务了,需要等把正确索引拷贝过来才行。