第零部分咱们已经列了一个提纲了,这一篇文章开始要详细说说了。git
在说搜索引擎架构分层以前,咱们先肯定几个搜索引擎的概念。github
文档
,搜索引擎的基本数据单元,好比一张网页,一个商品,多个文档合在一块儿就是一个搜索引擎的完整数据倒排索引
,正排索引
,存储在搜索引擎内部的数据结构,也是搜索引擎最底层的数据结构。索引器
,将文档
数据生成可供搜索的倒排索引
和正排索引
的程序就是索引器。检索器
,经过对倒排索引
和正排索引
进行查找,从而查找到文档
的程序。字段
,每一个文档可能有多个字段,好比一篇文章有标题,做者,摘要,详情,发布时间的,这些东西虽然在一个文档
中,可是搜索的时候须要区别对待。索引
,多个文档
经过索引器
生成了一堆倒排正排索引,咱们把这些倒排正排索引的集合叫索引
,若是后面提到索引
就是指正排和倒排索引的集合,索引也能够理解为数据库中的表。好了,上面就是搜索引擎的最基本的概念,搜索引擎简单的说分红两部分,一部分就是索引器
把文档变成倒排
和正排
文件,第二部分就是检索器
经过倒排
和正排
文件还原文档
的过程。算法
数据库其实也是一个搜索引擎,只是数据库和搜索引擎的侧重点不太同样,搜索引擎追求的是简单,速度快,而数据库追求的是稳定和复杂逻辑对数据的处理,因此应用场景不太同样。数据库
既然知道了一个搜索引擎的基本概念,应该怎么来设计这个搜索引擎呢?json
按照通常的软件设计逻辑,若是不是很是复杂的系统,要设计一个系统,首先要设计数据结构,而后把数据结构封装到各个算法和类中,而后将各个类组合起来就完成了,因此,我设计这个引擎,是基于如下几个层次来的。数组
倒排索引
和正排索引
,每一个字段都会创建相应的倒排和正排索引,这一部分应该有一系列相关的模块来实现;倒排索引
和正排索引
合起来就是整个数据文件,而后须要一些模块来对这些东西进行管理;索引器
和检索器
都在这里,相似ElasticSearch
的实现,因此也使用了分段的方式管理文档的索引
,每到必定的条件下将索引
刷新到磁盘或者将索引合并起来。索引
,引擎负责复杂的查询策略和排序策略,这个引擎是能够更换和修改了,只须要实现标准接口就行,也能够本身实现来替换默认的引擎达到更多的功能,甚至你能本身写一个引擎,实现SQL查询。json
来进行,这一层也能够重写成任何你须要的样子。按照上面这些个模块,一个搜索引擎,在总体架构上大约分红如下几个层次服务器
倒排索引
和正排索引
,也叫逆向索引
和正向索引
,为了方便,咱们这统一叫倒排索引
和正排索引
。在实现的时候,为了尽可能简单,每一个模块基本上都是一个文件来实现的,用了Golang
之后,代码写起来也自由起来了,只要清晰就行,因此整个引擎下来,代码量其实不是很大。微信
下面这个图就是整个代码的大框架图,后面咱们会一个一个的来说这些东西。网络
经过这一篇文章,但愿能对搜索引擎有个初步的了解了,后面我会一个一个模块一个一个技术点的来拆分一下这个搜索引擎。数据结构
接下来的文章会开始介绍搜索引擎的底层技术了,倒排索引【会花比较多精力来讲倒排索引,毕竟这是核心的核心】,正排索引【这个简单,就是数组】,在介绍的时候会有几篇文章介绍实现倒排索引技术须要的一些算法和数据结构。
代码托管在github
上,地址是github.com/wyh267/Falc…,代码还在不断更新中,目前代码量,去掉单元测试文件,大约是6000行,由于是想到哪写到哪,有些函数也没有用,因此还有优化空间,也但愿你们提交你的patch,后面讲的时候能够对照代码看看。
代码结构以下,再说一遍,代码量不大,结构也很是简单,虽然我写的代码注释很少,可是没有使用任何高级功能,闭包都没有,直接看没任何难度。
欢迎你们扫描一下下面的微信公众号订阅,首先会在这里发出来:)