2013-07-21 31 views
8

这不是第一次在Stackoverflow发布asked - 但它已经过了将近五年之后 - 时代和技术也发生了一些变化。我想知道现在人们在想什么建立一个搜索引擎?如何构建搜索引擎? (2013更新)

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

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

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

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

回答

1

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

履带

首先,爬虫是一个艰难的事情。真正的问题是在获取网页时尽可能快地将数据写入磁盘。主要的数据结构是一个倒排索引,所以当你得到单词“香蕉”时,你需要从磁盘中取出“香蕉”索引(它发生的文档列表 - 连同文档中的位置),并附加新记录并写回来。随着列表的增长,拉回写入速度变慢。所以一个技巧是将倒排索引(和文档)分割成分区,在第一个分区中说1-1000个文档,等等。另一个“技巧”是在抓取分区时将索引保存在内存中,并且只有在分区完成时才将其刷新到磁盘。

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

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

搜索

我们的目标是做快和高品质。要意识到的一件事是,如果您希望速度更快,则无法搜索整个数据集。幸运的是,我已经对所有内容进行了分区,因此搜索需要关键字出现的前100个分区(单独的索引),并且如果它找到“足够好”的结果 - 停止,如果不是 - 则需要100个分区,等等。

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

现在的质量。这是最艰难的,永远不够好。我最初的尝试是不仅保留文本的倒排索引,还保留标题,链接文本和网址。这些文件中的每一次打击都增加了一些要点。另一件事是用同义词改写查询,并以某种方式检查哪个查询效果最好。这可能值得在它自己的职位。

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