前面我们以“想要进行检索的数据已经在手边了”为前提,讲解了搜索引擎的结构及其构成要素。但是,在实际中这些数据来自哪里呢?在本章的最后,让我们再来大略地了解一下如何收集、整理作为检索对象的数据吧。 收集数据 搜索引擎中作为检索对象的数据来自哪里呢? 一种情况是要检索的数据已经存在了。有时是大量的数据已经存在于企业的文件服务器、邮件服务器,或每个人的PC 中了;有时是运营博客或社会化书签等Web 应用程序的公司,已将由应用程序的用户添加、更新的信息存入数据库等系统中了。在这种情况下,数据并不是我们亲自收集的,而是自然而然地储存起来的。 与此相对,还有一种是难以亲自收集数据的情况。例如,在Web 检索中,要借助前文所述的称为爬虫的软件遍历Web,才能将全世界的Web 网页收集起来。而当我们想在Twitter 外使用Twitter 的检索服务来收集推文时,还要利用Twitter 的API 等。 要收集的数据越多,收集、存储这些数据的机制就越复杂。例如,在需要保存大量数据的情况下,高效地管理存储器也是必不可少的环节。为了通过Web 应用程序保存大量的访问记录,应用程序的高度可扩展性就显得尤为重要。而且,为了使爬虫能够高效地运转起来,还必须设法优化遍历Web 的算法。 由于这些都不是针对搜索引擎的技术,而且也超过了本书的讨论范围,所以我们就简单介绍到这里。但是如果要开发、运维能够处理大规模数据的搜索引擎,还是不 可避免地要去攻克诸如此类的、各种各样的技术难题。 数据规范化 以某种方法收集而来的数据只有经过处理才能成为适合搜索引擎检索的文档。例如、由爬虫收集而来的HTML 文件除了包含内容还包含了标签等标识页面结构的信息;而文件服务器中的PDF 文件存储了由私有的二进制结构表示的内容。这些文件都包含着不利于检索的信息,因此要将它们规范为只包含要查询的文字信息或文章内容的文档。例如,在规范HTML 文件时,就要删除标签并提取出作为检索对象的文章(内容)。 另外,提取出来的文章也未必都是按照规则书写的。例如,可能会遇到在某篇文章中使用的是全角的数字和字母,而在另一篇文章中使用的又是半角的数字和字母这种情况。在这种情况下,就要按照某种约定好的规则(例如统一使用半角字符)来使文档规范化。相应地,只要对查询也进行了同样的规范化,就能查找到(匹配到)规范化之前无法找到(无法匹配)的文档。 因此,大多数提供检索服务的系统都会先转换收集而来的数据,使其格式适合作为搜索引擎的输入文档。 至此为止,有关搜索引擎基本概念的讲解就结束了。诸位辛苦了。倒排索引是一种非常简单的结构,因此理解起来应该并不吃力。如果仅仅是“想制作一个检索系统”,那么以目前为止讲解过的基础知识为基础,并借助开源的搜索引擎A,应该就可以在较短的时间内将其实现了。尽管如此,但如果一味地利用已有的搜索引擎,可能就很难深入地了解搜索引擎的原理,或是优化现有的搜索引擎了。那么应该怎么做呢?笔者认为,动手制作一个简单的搜索引擎正是实现这些目标(能够制作出来、深入了解原理、能够进行优化)的最好方法。基于这种想法,从第2 章开始,就让我们一边通 过源代码从内部梳理搜索引擎的工作流程,一边体验搜索引擎的开发过程吧。请诸位一定要一边实际动手做,一边更加深入地去探索搜索引擎的结构。 ----———— A 从使用了Apache Lucene 或Lucene 的Solr 和Elasticsearch,到笔者(未永)也 参与了开发的Groonga 和Senna 等,都是很优秀的软件。