前些日子使用悟空搜索 搭了个简单的搜索引擎(见这里 ), 用着还能够,就是有一点很差,内存占用的太多了。每次内存用超了,搜索引擎的进程都会被系统干掉。 由于是和十三哥一块儿租的服务器,两我的的程序都在上面跑,平时还作些实验什么的, 为了保证服务器不被搞死,对进程的内存限制暂时是不打算解开的。再说了,就我这么个小网站, 也就几百个网页的量,竟然占我50%的内存,这确定不行的啊。前端
固然,这也不能怪"悟空搜索",由于在去年的 GopherChina 大会上, 就听见做者在讲台上亲口宣布,说这个数据会全都加载到内存, 我以为我数据量又不大,数据都放内存也占不了多少资源嘛,因此就放心大胆的用了,就是结果有点儿出乎个人意料而已。 为了解决内存占用过多的问题,一开始我打算修改这个项目的代码,把数据放到磁盘上,减轻内存的压力。 不过在开始以前,我想先更详细的了解一下搜索引擎,因此也就没动手,而是先找了本讲搜索引擎的书看了看, 就是这本《这就是搜索引擎》。git
首先,感谢做者写的这本书,讲的很详细,也很透彻,致使我看完了这本书,以为我本身也能写个搜索引擎。 对于个人搜索引擎,效率和可用性先放在一边,和正经的搜索引擎确定无法比,可是,能用。^_^github
索性我也别改"悟空搜索"了,先写个本身的搜索引擎练练手吧。而后就有了这个东西。目前已经在个人网站使用了, 地址是http://www.fengbohello.top/s 。有兴趣的同窗能够去看看, 搜索结果还很粗糙,结果展现页面也没深加工,目前就是能凑合着用,对于查找我本身的资料还行, 由于一共也没多少数据,也就 400 来个网页。算法
下面来讲说我都干了啥:json
第一,固然就是设计框架。服务器
由于以前使用了"悟空搜索",个人网站后台和前端以及和搜索引擎以前的接口都是现成的, 我也不想再从新走出一条路,就用以前的东西(在这里)。数据结构
第二,就是找库。框架
先是找分词库,选中了 friso。这个分词库用起来也很简单,容易和其它项目结合。测试
在"搜索引擎"可以进入测试阶段以后,就能够上线了。上次是使用 GO语言 的 HTTPD 服务来 给个人网站提供的查询。不过此次我想尝试一下其它的方式,好比 RPC。 最后找到了 jsonrpc-c,发现简单又好用,那就它了。 目前这个项目直接依赖的库就是这两个(jsonrpc-c 还会依赖 libev)。网站
第三,就是写代码。
这点仍是有点儿感触的。由于这个引擎是用C写的,在码代码的过程当中,发现有些在 C++ 上做为标配的数据结构没有,好比 map,好比 vector。做为练手,我也顺便写了个相似 vector 的容器 和一个 map,不过 map 是用平衡二叉树实现的,而不是红黑树。作这些边角料的工做, 也增长了我对内存更精确的掌控能力。
第四,是使用哪一种方式计算文档的类似度。
这里我使用的是向量空间的方式,由于这种方式实现起来最简单了。 之后有时间再尝试使用更复杂的算法。
至于更具体的有关"搜索引擎"的数据结构方面的介绍,基本是根据《这就是搜索引擎》来实现的。 下一篇来介绍具体的数据结构的实现,好比单词索引、倒排索引和文档的类似度计算等内容。