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