A Comparison of Open Source Search Engines
Christian Middleton, Ricardo Baeza-Yates
作者:
Christian Middleton
http://www.linkedin.com/in/cmiddlet
Hi5的高级工程师。
Ricardo Baeza-Yates
http://research.yahoo.com/Ricardo_Baeza-Yates
Yahoo的高级研究人员。
翻译:
史春奇,
搜索工程师,
中科院计算所毕业,
chunqi.shi@hotmail.com
原 文:http://wrg.upf.edu/WRG/dctos/Middleton-Baeza.pdf
目录
第1章 简介
随着互联网信息量的激增, 为用户提供网上相关信息的检索成为迫切需求。而当你准备在网站上提供这种检索服务的时 候, 你可以选择, 要么利用商业搜索引擎,要么选择开源搜索引擎。对于很多站点, 采用商业搜索引擎, 可能没预期的那么便捷, 你得花钱, 而且呀, 你可能没大站点那样受人家重视。 另一方面,开源搜索引擎也能提供商业搜索引擎的同类功能(部分能够处理大数据量), 同时拥有开源理念带来的好处: 不花钱,可以更主动地来维护软件,也通过二次开发来满足个人的需求。
现今,可以选择的开源产品很多, 而要决定是采用哪个开源产品, 就必须认真考虑每个开源产品的不同的特性。对这些搜索引擎划分的依据可以是开发的编程语 言, 索引文件的存储(倒排文件, 数据库, 还是其他 文件格式), 查询的能力(布尔运算, 模糊查询, 词根替换等等), 排序策略, 支持索引的文件类型, 在线索引能力和增量索引的能力。 其他值得考虑的重要因素是项目的最后更新日期, 当前版本和项目的活跃度。 这些因素之所以重要是因为, 如果一个开源搜索引擎在近期没有更新的话, 那么要满足现在的网站的话, 可能存在很多的缺陷和问题。 利用这些特性就可以给出一个大体上的划分, 同时能够减少待选的开源产品的数目。 最后, 考虑不同负 载的时候搜索引擎的性能, 当信息量增加时, 性能的如何降低的,这些也非常重要。 此时,就要分析数据量和索引时间的对比情况, 索引阶段所用的资源, 和检索阶段的性能。
就目前我们了解的情况, 本文的工作是首创,比较了17个主流搜索引擎, 并 且在不同的文档集合和多种查询类型的情况下,比较了索引和查询的性能。本文的目的是告诉人们遇到某种搜索需求的时候,该如何选择是最合适的开源搜索引擎。
第二章, 介绍信息 检索的基础概念, 第三章, 描述一下本文的搜索引擎, 第四章, 测试实验的实现思路, 第五章前两节, 给出实验的结果。 第五章最后一节, 对结果进行分析。 最后, 第 六章进行总结。第2章 背景
信息检索(IR)是一个较广的领域, 一般符合如下定义: 是对信息项进行数据表示, 存储, 组织和访问的领域。
作为一个较广的领域, 信息检索必须要能够在对信息进行处理后,用户就能够容易地访问到他们关注的信息。 另一个也不失一般性的定义,描述如下:信息检索是从大量数据集合(通常是存放在本地服务 器或者互联网上)中, 查找满足需求的非结构化(文本)数据(文档)集。
核心思想是从可以获取到的数据中,检索出具有相关性的部分来满足用户的信息需求。 为了实现这个目的, 信息检索(IR)系统由几个相互关联的模块组成(图2.1)。通常这些模块含有三个方面的: 索引, 查找和排 序。
图2.1:信息检索过程
索引:负责表示和组织所有信息, 实现高效的信息访问。
查询:从索引中抽出满足用户需求的信息。
排序:尽管这是非必须的步骤, 但对检索来说非常重要, 启示式地对检索结果尽可能按照满足用户需求的方式排序。
2.1 文档收集要有信息可以检索的话,就要先收集信息,作为索引的入口数据。待收集文档可以是任何类型的数据,只 要能从中抽取出信息来。 这就有很多场景了, 要具体看检索系统的应用背景了。
2.1.1网页抓取在网页搜索的场景中, 网络爬虫是相当必要的。 简单来讲,爬虫是能够在网站间游走, 并且将访问过的页面下载保存下来。 网络爬虫种类很多, 有 些是商业的, 也有开源的。 由于网页是海量的, 所以为了平衡新页面的抓取和已抓取页面的更新, 会采用各种的抓取算法。 同样的, 也有必要考虑被抓网站的带宽情况, 避免把对方网站抓瘫痪了。
2.1.2文本检索大会TREC也有已经生成好的文档集合是被用来做学术研究的。 例如, 文本检索大 会(TREC)就 准备了大小和类型不同的好几类文档集合,每个都是为不同任务设计的。根据对文档不同的研究目的,研究被分成各种项目类型。 例如2007 TREC的项目类型有:
博客组: 目的是展现博客环境中的信息查找的行为规律。
企业组: 分析企业搜索。满足用户查找企业数据来完成某些任务。
基因组: 在特定领域的检索研究(基因数据)。
垃圾组: 对已有的和推荐的垃圾过滤方法进行研究。
利用这些文档集合, TREC也作为一个标准的数据集实例, 被各个小组采用各种方法去处理, 然后基于这相同的实例进行分析得到的不同结果, 来讨论和比较不同检索方法。 所以TREC也提供一组检索任务和查询结果相关性的判断。
Table 2.1, 倒排索引举例, 对 每个出现的词, 都保存了在文档中的位置列表
这样才使得研究不同信息检索(IR)系统的准确率和召回率成为可能。
2.2 索引
要实现对大文档集合的高效率的检索, 就需要重新组织数据, 存储到特定的设计好的数据结构中。 这就是索引, 它使 得快速检索文档集合变得容易, 简单来说, 就是减少两两比较的次数。在文本检索中, 最常用的数据结构是倒排索引(见表2.1), 它包含一个 词典, 词典包含了所有在文档中出现的词汇。 同时, 词典中每个单词映射了一个位置列表, 列出这个单词在哪些文档中出现了, 以及出现的位置信息。 当然不同应用对应的需求的类型也不同, 在一些应用中, 会将文档自身给出来,而不仅仅是位置信息,这依然是一种倒排索引。
索引存储需要的空间和文档集合的大小成正比关系, 有些方法可以用来减少和优化存储需要的空间。 通常来说, 一个词 典需要的存储空间不大, 但是位置列表的存储需要极大的空间。 另外, 一个搜索引擎的功能也决定着存储空间的大小,这就需要在提供哪些功能和存储空间之间进行平衡。 例如,为了给出用户检索词周围的文本片段, 有些索引存储了文档的全文,而另外一些索 引则不提供文本片段, 这样需要的存储空间就较少。 一些索引对位置列表进行压缩, (例如采用段地址, 将文本切成段,使得多个实例都被划分到较少的段中, 而索引地址就指向这些段), 但是这种方式的代价是要精确地获取单词的位置时, 需要额外开销(在本文的例子中需要顺序扫描目标段)。
在索引之前, 有个 几预处理需要完成,其中最常见的是停用词消减,和词根替换。
有些词在文档中出现的极为频繁, 但是对检索而言,它们的相关性却很小(例如, 在英文中, “a”, “an”, “be”, “for”)[对应到中文, “的”, “是”,“这”, “那”等 ]。 它们被称为停 用词, 不同的应用和不同的语言,有着不同的停用词表。 所以停用词消减成为一种常做的预处理,从文本中除去这些停用词,不索引它们,这就大大减少了倒排索 引的大小。
另一个叫词根替换, 这 也很常见, 除了用户检索的词外, 出现在文本当中的这个词的变体形式, 例如复数和过去式,也希望能够被匹配。 为了解决这个问题,一些索引采用获取词根的算法, 在查询的时候用词根来进行替换。 词根一般是不带词缀的部分。例如“connect”是“connected”“connecting”“connection”“connections”的词根。
预处理也好, 索引 结构也好,在影响存储空间的同时,也会影响索引的时间开销。之前提过, 根据不用的应用需求, 建索引过程中可能要在时间开销作出牺牲, 以便获得一个更省空间的索引存储。 当然, 索引的特性 也会影响查询, 在本文后面会有说明。