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