很早就想写一系列的这样的文章了,以前在一个电商公司作搜索,对搜索引擎有一些认识,来到一个新的创业公司之后很是高兴还有机会继续作这方面的事情,虽然领域已经变了,并且不是作搜索了,可是技术仍是那些技术,而且有机会接触到了Go
语言,对于一个将近10年C/C++
的程序员来讲,Go
的一些特质让我以为很是舒服,可参见我以前的这篇文章。git
从公司项目衍生出了一个本身的搜索引擎项目,而后有了这篇文章。程序员
先聊聊目标吧,我但愿实现一个这样的搜索引擎github
- 使用
Go
语言实现,方便部署,最好就用一个二进制文件搞定一些,不须要安装任何依赖。
- 相似一个电商的搜索引擎,支持多字段的检索,不只仅是文本的全文索引,还须要包括过滤功能(
好比价格区间过滤
),汇总功能(好比结果集中品牌数量汇总
),基本的统计功能。
- 索引器和搜索器在一块儿,主要是为了简洁,不用启多个实例。
- 支持创建多个索引,而且多个索引若是有主键关联,能够进行多索引的联查(速度就只能呵呵了)。
- 对于1000万的文档,单个词的平均查询时间小于10ms。
- 对于一台8核8G内存的机器,QPS达到2000。
- 尽量的少用机器内存,在2G的机器上也能进行1000万以上的文档搜索。
- 有较强的扩展性,能够本身扩展策略。
- 能够进行分布式的集群部署,增长可搜索的文档数量,提升系统的查询吞吐量。
- 支持中文分词,但分词不是咱们的重点。
- 支持相关性排序,但相关性排序也不是咱们的重点。
- 重要的一点,因为是对搜索引擎的一个全面实现,尽可能不用开源的代码,全部算法和数据结构都本身实现,固然,也能够方便的进行开源替代。
固然,一个搜索引擎涉及的部分实在是太多了,下面几个部分不是咱们的重点,也不会进行深刻的实现算法
- 没有爬虫部分,搜索引擎的爬虫又是一个另外的话题了,也能够写一个很复杂的系统出来,因此咱们这里不涉及爬虫的部分
- 不涉及算法的部分,所谓算法部分就是排序算法,各类相关度计算,这也是一个另外的话题了,等这一系列文章结束之后再来讲说排序的算法,目前仅仅有的是按照TF*IDF进行基本的相关性的基本排序
- 不涉及分词部分,分词部分也是一个单独的话题,直接实现了一个很是很是很是(重要事情说三遍)简单的中文分词器(一个函数),能够用就好了。
目前代码部分已经完成了一大半了,可是尚未进行优化,而且最后一个分布式引擎尚未完成。可是代码的核心部分,也就是搜索引擎自己的技术部分已经完成了,也已经在github
上托管了,因此这一系列文章出现不更新的状况也不太可能,毕竟代码已经基本完成了。微信
好了,下面咱们开始吧,整个系列文章将分红如下几个部分来进行描述数据结构
- 一个单机的搜索引擎的架构,包括搜索引擎的模块组成,各个模块的功能已经他们之间的关系,这个部分会对搜索引擎总体有个了解,方便后面的文章的详细描述,这一部分可能会比较短,后面到第三部分会再详细说。
- 搜索引擎的底层技术部分,这部分比较多的内容,会分开一个一个的讲,包括倒排索引技术,正排索引技术,分词算法,MMAP技术,这些是构成一个搜索引擎必要的底层技术,会在这一部分作介绍
- 一步一步的实现一个单机的搜索引擎,按照模块从最底层的倒排和正排索引实现一直到最上层的引擎部分的实现,这一部分若是涉及到了相应的数据结构和算法也会单独写,好比哈希表算法,B+TREE算法,BitMap算法,有些我这个引擎中没有实现的算法也会一块儿讲讲,好比跳表,前缀树,布隆过滤器等等。
- 分布式部分【TODO:须要等我代码写完了才行】,包括如何进行分布式,各个机器之间若是进行同步,索引若是进行分片
代码已经在git上开源了,我会本周再整理一下就公布出来,目前就一堆代码实在没办法看。架构
好了,算是开了一个头了,文章的更新频率会在一周3到5篇左右吧,欢迎你们扫描一下下面的微信公众号订阅,首先会在这里发出来:)数据结构和算法