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