1.6 搜索引擎基本技术
一个基本的搜索包括采集数据的爬虫和索引库管理以及搜索页面展现等部分。本书的第2章到第6章将分别详细介绍这些内容。
1.6.1 网络蜘蛛
网络蜘蛛(Spider)又被称作网络机器人(Robot),或者Crawler,它的主要目的是为获取互联网上的信息。网络蜘蛛利用主页中的超文本链接遍历Web,通过URL引用从一个HTML文档爬行到另一个HTML文档。http://dmoz.org是整个互联网抓取的入口。网络蜘蛛收集信息可有多种用途,如建立索引、HTML文件的验证、URL链接验证、获取更新信息、站点镜像等。网络蜘蛛建立的页面数据库包含根据页面内容生成的文摘,这是一个重要特色。
在抓取网页时,大部分网络机器人会遵循Robot.txt协议。
网站本身可以声明不想被搜索引擎收入的内容。可以有两种实现方式:第一种方式是在你的站点上增加一个纯文本文件http://www.yourdomain.com/robots.txt;另外一种方式是直接在HTML页面中使用robots的meta标签。
1.6.2 全文索引结构
有如下两个文档:
● Doc1:When in Rome, do as the Romans do.
● Doc2:When do you come back from Rome?
文档经过如下停用词表的过滤:
in as the from
在Lucene中形成的索引结构如图1-5所示。
图1-5 Lucene中形成的索引结构
在Lucene的索引文件中,以tis为后缀的文件中包含了term信息;以frq为后缀的文件包含term的文档编号和在文档中出现的频率信息;以prx为后缀的文件包含了term出现的位置。
折半查找Term。对于特别大的顺序集合可以用插值查找的方法提高查找速度。
1.6.3 Lucene全文检索引擎
Lucene是一个开放源代码的全文索引库。经过十多年的发展,Lucene拥有了大量的用户和活跃的开发团队。如果说Google是拥有最多用户访问的搜索引擎网站,那么拥有最多开发人员支持的搜索包也许是Lucene。它最初由Java开发而成,现在有了C#和C++等移植版本。
它的官方网站地址是http://lucene.apache.org/。
下面我们结合第1.1节中的代码介绍Lucene中的相关概念。
● 第一个概念是Index,也就是索引库,在Lucene中并不存在Index的类。通过IndexWriter来写索引,通过IndexReader来读索引。
● 一段有意义的文字需要通过Analyzer分割成一个个词语后才能按关键词搜索。Analyzer就是分析器,StandardAnalyzer是Lucene中最常用的分析器。为了达到更好的搜索效果,不同的语言可以使用不同的分析器,例如CnAnalyzer就是一个主要处理中文的分析器。
● Analyzer返回的结果就是一串Token。Token包含一个代表词本身含义的字符串和该词在文章中相应的起止偏移位置,Token还包含一个用来存储词类型的字符串。
● 一个Document代表索引库中的一条记录。要搜索的信息封装成Document后通过IndexWriter写入索引库。调用Searcher接口按关键词搜索后,返回的也是一个封装后的Document列表。
● 一个Document可以包含多个列,叫做field。例如一篇文章可以包含“标题”、“正文”、“修改时间”等field,创建这些列对象以后,可以通过Document的add方法增加这些列。
● Term是搜索语法的最小单位,复杂的搜索语法会分解成一个个的Term查询。它表示文档的一个词语,Term由两部分组成:它表示的词语和这个词语所出现的field。
【作者提示】Lucene中的API相对于数据库来说比较灵活,没有类似数据库先定义表结构后使用的过程。如果前后两次写索引时定义的列名称不一样,Lucene会自动创建新的列,所以field的一致性需要我们自己掌握。
1.6.4 Nutch网络搜索软件
Nutch是构架于Lucene索引库基础上的网络搜索引擎。按照Nutch的设计,它可以搜索的范围可以是本地的局域网、Intranet、垂直的行业信息或者是整个互联网。抓取部分和搜索部分是它的两个基本组成部分。其基本结构如图1-6所示。
图1-6 Nutch结构图
Nutch从0.8版本开始,把分布式计算处理部分独立出来,命名为Hadoop。Hadoop主要包括分布式的文件系统(DFS的实现在org.apache.hadoop.dfs中)和一个MapReduce分布式数据处理器(MapReduce的实现在org.apache.hadoop.mapred中)。
1.6.5 用户界面
搜索用户界面一般由搜索首页、搜索结果显示页和高级搜索页面组成。如图1-7所示是一个搜索首页,包含一个搜索输入提示的效果。
图1-7 搜索首页界面
下面是一个搜索结果页面,如图1-8所示。
图1-8 搜索结果页面
在搜索结果页面中会对搜索词高亮显示,在搜索输入框下面会给出相关搜索词列表。如果用户搜索错误,在搜索输入框下面会给出可能的查询词提示“你是不是要找:XXX”,如图1-9所示。
图1-9 查询词提示
下面是一个网站搜索的高级搜索界面,如图1-10所示。
图1-10 高级搜索界面
如图1-10所示的界面中包含对“标题”、“内容”、“作者”和“发布日期”多个字段的联合查询,它们之间是“与”的逻辑关系。