我会在从头开始编写一个小的搜索引擎使用此问题,分享一些经验(没有搜索特定的库被用于)一个相当小的数据集(它实际上搜索stackoverflow,因为它既不是太小也不能太大以至于不能在单个服务器上工作)。 Check it out。以下是我关于这个问题的发现。
履带
首先,爬虫是一个艰难的事情。真正的问题是在获取网页时尽可能快地将数据写入磁盘。主要的数据结构是一个倒排索引,所以当你得到单词“香蕉”时,你需要从磁盘中取出“香蕉”索引(它发生的文档列表 - 连同文档中的位置),并附加新记录并写回来。随着列表的增长,拉回写入速度变慢。所以一个技巧是将倒排索引(和文档)分割成分区,在第一个分区中说1-1000个文档,等等。另一个“技巧”是在抓取分区时将索引保存在内存中,并且只有在分区完成时才将其刷新到磁盘。
重要的一点:用什么来存储数据?有很多选择,经过多次实验,我发现leveldb是今天的最佳选择。不要忘记SSD磁盘!
因此,总而言之,使用一台机器(4 Gb ram)以这种方式爬取大部分计算器(大约13 000 000页)需要大约2个月的时间。结果数据(倒排索引,原始剥离文本等) - 大约80 GB的磁盘空间。
搜索
我们的目标是做快和高品质。要意识到的一件事是,如果您希望速度更快,则无法搜索整个数据集。幸运的是,我已经对所有内容进行了分区,因此搜索需要关键字出现的前100个分区(单独的索引),并且如果它找到“足够好”的结果 - 停止,如果不是 - 则需要100个分区,等等。
最慢的部分是从磁盘读取索引并对其进行反序列化。Leveldb支持快速顺序读取,因此数据需要以大部分顺序读取的方式进行存储。一旦进入内存集合交集非常快。
现在的质量。这是最艰难的,永远不够好。我最初的尝试是不仅保留文本的倒排索引,还保留标题,链接文本和网址。这些文件中的每一次打击都增加了一些要点。另一件事是用同义词改写查询,并以某种方式检查哪个查询效果最好。这可能值得在它自己的职位。
无论如何,我希望它会有用的阅读!
来源
2015-09-02 20:56:28
ren
谢谢!我曾看过这个,但忘记了它在哪里。 – davemackey