本章首先概要地介绍搜索引擎的总体结构和基本模块,
然后介绍其中最核心的模块—全文检索的基本原理。
1.1 搜索引擎基本模块
1.2 开发环境
1.3 搜索引擎工作原理
1.3.1 网络爬虫
一个基本的搜索包括采集数据的爬虫和索引库管理以及搜索页面展现等部分。
网络爬虫收集到的信息可有多种用途,如建立索引、HTML文件的验证、URL链接验证、获取更新信息、站点镜像等。为了检查网页内容是否更新过,网络爬虫建立的页面数据库往往包含根据页面内容生成的文摘。
1.3.2 全文索引结构与Lucene实现
倒排索引是相对于正向索引来说的,首先用正向索引来存储每个文档对应的单词列表,然后再建立倒排索引,根据单词来索引文档编号。
不太可能搜索某些词,这样不被索引的词叫做停用词。
每个单词(term)后面的文档编号(docld)列表叫做 posting list。
在Lucene中,倒排索引结构存储在二进制格式的多个索引文件中,其中
- 以tis为后缀的文件中包含了单词信息;
- 以frq为后缀的文件记录单词的文档编号和这个单词在文档中出现了多少次,也就是频率信息;
- 以prx为后缀的文件包含了单词出现的位置信息。
为了快速查找单词,可以先对单词列表排序,然后再折半查找已经排好序的词表。
在Lucene中,org.apache.lucene.index.TermInfosReader 类的getlndexOffset方法实现了一个类似的折半查找。
对于特别大的顺序集合可以采用插值法查找以提高查找速度。
Lucene中的基本概念介绍如下。
·第一个概念是Index,也就是索引库。文档的集合组成索引。和一般的数据库不一样,Lucene不支持定义主键。在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。
1.3.3 搜索用户界面
1.3.4 计算框架
1.3.5 文本挖掘
搜索文本信息需要理解人类的自然语言。文本挖掘指从大量文本数据中抽取隐含的、未知的、可能有用的信息。
常用的文本挖掘方法包括:全文检索、中文分词、句法分析、文本分类、文本聚类、关键词提取、文本摘要、信息提取、智能问答等。文本挖掘相关技术的结构如图1-8所示。
与文本挖掘技术对应的是包括语音识别、基于内容的图像检索等技术的流媒体挖掘技术。随着网络电视和视频网站的流行,流媒体挖掘技术正越来越引起人们的关注。