如何构建搜索引擎? (2013年更新)

时间:2013-07-21 22:07:02

标签: search search-engine nutch common-crawl

这不是第一次在Stackoverflow上出现这个问题asked - 但是差不多五年之后 - 时代和技术发生了一些变化。我想知道人们现在在想什么建立一个搜索引擎?

例如,我知道Nutch正在继续开发 - 但它仍然是最强大的解决方案吗?是否有可用于其他语言的替代成熟解决方案 - 例如C#,PHP,VB.NET?

我也知道现在可以使用公开的质量指数,减少了从Common Crawl执行自己的蜘蛛的需要。

当然,还有一些自定义搜索引擎解决方案,最着名的是Google's CSE ......但我不知道有任何其他主要/稳定/声誉良好的搜索引擎解决方案相信建立引擎?

现在有哪些资源可用于学习几年前甚至去年都没有的编程搜索引擎?

2 个答案:

答案 0 :(得分:1)

Udacity通过创建网络爬虫学习Python非常好的课程,请在此处尝试: https://www.udacity.com/course/cs101

答案 1 :(得分:1)

我将使用这个问题分享一些从头开始编写小型搜索引擎的经验(没有使用特定于搜索的库)用于相当小的数据集(它实际上搜索stackoverflow因为它既不太小也不太大而不能在单个服务器上工作)。 Check it out。以下是我对这个问题的研究结果。

<强>履带

首先,爬虫是一件很难的事情。真正的问题是将数据写入磁盘的速度与获取网页的速度一样快。主数据结构是一个倒排索引,所以当你得到单词“banana”时,你需要从磁盘中取出“香蕉”索引(它出现的文件列表 - 连同文档中的位置)用新记录附加它并写回来。随着列表的增长,拉回和写回来的速度越来越慢。因此,一个技巧是将反向索引(和文档)分割成分区,比如第一个分区中的1-1000个文档,依此类推。另一个“技巧”是在抓取分区以将索引保留在内存中,并仅在分区完成时将它们刷新到磁盘。

重要位:用于存储数据的内容是什么?有很多选择,经过多次实验,我发现leveldb是今天的最佳选择。不要忘记SSD磁盘!

所以,总而言之,使用一台机器(4 Gb ram)以这种方式爬行大部分stackoverflow(~13,000 000页)大约需要2个月。结果数据(倒排索引,原始剥离文本等) - 大约80 GB的磁盘空间。

搜索

目标是快速,高质量地完成。需要注意的一件事是,如果您希望它快速,则无法搜索整个数据集。幸运的是,我把所有内容都分区了,所以搜索占用关键字出现的前100个分区(单独的索引),如果找到“足够好”的结果 - 如果没有,则停止 - 再取100,依此类推。

最慢的部分是从磁盘读取索引并对其进行反序列化。 Leveldb支持快速顺序读取,因此数据需要以大部分可以顺序读取的方式存储。一旦进入内存设置交集非常快。

现在的质量。这是最艰难的,也永远不够好。我最初的尝试是不仅为文本保留倒排索引,还为标题,链接文本和URL保留倒排索引。每次点击都会为文档添加一些要点。另一件事是使用同义词重新定义查询,并以某种方式检查哪个查询效果最好。这可能值得一个帖子。

无论如何,我希望阅读有用!