全文搜索引擎

2024-10-19

全文搜索引擎(共4篇)

全文搜索引擎 篇1

0 引 言

随着Internet和WWW的迅速发展, Internet上的资源越来越丰富, 基于Internet的各类信息检索服务随之诞生并获得了迅速的发展。在中国, 出现了非常优秀的中文、英文搜索引擎, 如Google、Baidu等, 但是这些搜索引擎没有解决少数民族语言文字特征方面的关键问题 (民文在线输入及显示, 标准字符编码, 网页布局及书写方向, 关键词语处理等) , 完全不能满足少数民族语种的网络信息检索需求。到目前为止, 针对维吾尔文、哈萨克文、柯尔克孜文 (以下简称维、哈、柯文) 等少数民族语言的搜索引擎的研究还处在空白阶段, 还没有一个比较成熟的搜索引擎。新疆是个多民族、多语言、多文字、多元文化的地区。为了使新疆少数民族人民适应时代和经济的发展, 已经有许多人或机构纷纷创建各种类型的自己语言的网站 (主要是维、哈、柯文三种语言) , 传播本民族信息, 促进本民族经济发展。为了能够在网上快速检索以本民族语言发布的信息页而开发一个多文种搜索引擎是新疆少数民族面临的一个急待解决的重要问题。因此, 开发一个比较完整的少数民族语种的搜索引擎, 为广大的少数民族网络用户民文信息检索提供方便, 对于发展少数民族地区教育和经济, 提升社会的信息化水平有着非常重要的意义。

1 系统总体设计

如图1 所示。本搜索引擎由四个服务模块组成[1]。

维、哈、柯全文搜索引擎中各模块的主要功能如下:

(1) 数据采集模块[2] (Crawler)

下载维、哈、柯文网页并存储到html文档库中。

(2) 文档处理模块[3] (Analyzer)

从html文档库中读取已下载的页面数据, 并提取页面正文, 将正文字符转换成标准Unicode字符, 再经过分词 (关键词) 、去除停用词和常用词、词根切分等处理之后生成索引关键词序列并存储到索引库中。

(3) 索引模块[4] (Indexer)

负责根据索引库的内容和Page rank值在内存中建立到排索引表, 并根据查询关键词给检索服务模块 (Retrieval Server) 返回关键词有关索引信息。

(4) 检索服务模块[5,6] (Retrieval Server)

负责接受用户查询, 对查询关键词进行预处理和进行数据库检索, 并将结果展现给用户。

2 前期工作

因为使用新疆少数民族文字建立的网站 (主要是维、哈、柯文) 比起使用中文或英文的网站少得多, 所以首先统计这些网站, 收集他们的种子URL地址 (首页地址) 、网站性质和他们所使用的字符编码标准、语种等信息。据我们统计, 现在访问率较高的维、哈、柯文网站大概有250多个, 其中大概有四分之一的网站使用非标准的字符编码 (主要有三种非标准字库) 。因此, 对这些网站中被爬行到的网页还需要进行额外的字符代码标准化工作, 否则无法正常显示搜索结果。同时收集了大量的维、哈、柯文单词、词根、停用词, 分别创建了维、哈、柯文词语库、词根库和停用词库等必要的语料库在后继开发中使用。

3 主要功能模块的实现

3.1 数据采集模块的实现

所有爬行器都首先获取某一个网站的入口网页然后对它进行分析并把分析的结果作为下次爬行的前提, 我们的爬行器也使用这种思路, 并且为了提高爬行器的工作效率我们使用了多线程策略。一般下载页面的方法有三种, 其第一种方法是直接使用开发环境提供的类库, 如:Visual Studio.Net中的HttpWebRequest, HttpWebResponse等。操作简单, 但是某些页面 (实用保护技术) 不能下载。第二种方法是开发人员自己实现Http协议, 但具体实现Http协议的过程太复杂了, 编程难度大。第三种方法, 也就是我们选用的方法是使用操作系统提供的WinInet (Win32 Internet Function) API 函数, 是一个易用的网络编程接口, 可以大大简化编成难度。数据采集模块的工作流程如图2所示。

其中URL处理模块主要用来对待下载的URL利用某种策略进行排序, 并根据一定的策略向协议处理模块分配URL。协议处理模块主要通过各种Web 协议来完成页面的下载。重复内容检测主要用来消除一些镜像页面的影响, 然后把非重复页面 (页面ID, 语种, 地址, 更新日期, HTML代码等) 存放到下载页面库中。URL提取和过滤完成的就是从页面中提取超链并将所需的URL提交给URL处理模块进行处理的功能。

3.2 文档处理模块的实现

对已下载的页面进行分析和处理, 从而得到一系列重要信息是整个搜索引擎的核心。本模块中主要实现的功能有:

1) 从html文档库中读取已下载的网页并进行网页去噪和正文提取。

2) 确定正文所使用的字符编码标准是哪一种编码标准 (标准还是非标准) , 如果是非标准的, 则将正文字符转换成标准Unicode (维、哈、柯文) 字符。

3) 正文分词, 通过我们预先建立好的停用词 (stop words) 库删除其中的停用词, 然后对剩下的关键词进行词根切分, 并对同根词进行压缩生成检索关键词序列。形成的结果是文档号到索引词的对应关系表。每条记录中包括文档编号、索引词编号, 索引词在文档中的位置、出现次数、长度等信息。最后把以上得到的数据存储到索引库中。维、哈、柯全文搜索引擎文档处理模块结构如图3所示。

3.3 索引模块的实现

到目前为止, 维、哈、柯文网页的总数目大约在5万个左右, 相对于英文、中文网页来说, 数目非常小。再考虑系统硬件资源, 我们设计的索引器模块运行在一台Sun Sparc服务器上, 其所具有的内存容量为8GB, 这足以将索引表全部建立在服务器的内存中。针对维、哈、柯文网页所具有的实际情况, 以及构建维、哈、柯多语种全文搜索引擎所拥有的硬件资源, 在设计中将倒排索引作为索引结构, 在内存中建立索引表。这样可以充分利用硬件资源, 提高效率。

针对以上情况, 设计中采用Hash链表作为倒排索引模块的数据结构。在倒排索引的具体实现中, 将数组作为Hash链表的表头, 对于每一个关键词首先通过Hash函数来计算得到一个key值, 然后用key值同数组大小进行取模运算, 这样就可以将一个关键词映射到某一个特定的Hash链中。Hash链表的节点中存储了每个关键词的倒排索引信息, 包括关键词、包含此关键词的网页编号、此关键词在包含它的网页中的位置信息等内容。倒排索引的组织形式如图4所示。

倒排索引模块启动后 (其工作流程如图5所示) , 连接Oracle数据库, 从索引库中读出关键词序列并建立到排索引表, 索引建立完毕后, 就可以接受检索服务模块的查询请求了。当检索服务模块有查询请求到来时, 就从倒排索引表中查找相对应的关键词, 进行一些必要的处理后, 将查询结果返回给检索服务模块, 之后立即断开与检索服务之间的Socket连接, 并继续等待检索服务的其他查询请求。

3.4 检索服务模块的实现

检索服务模块负责接受用户查询、对查询关键词进行预处理和进行数据库检索、并将结果展现给用户, 是本搜索引擎的用户接口。因为该模块的实现牵涉到一系列少数民族语言计算机处理技术问题, 因此, 如果这些问题没有得到彻底的解决, 将会明显降低搜索引擎的查准率和查全率。维、哈、柯全文搜索引擎Retrieval Server模块结构如图6所示。

· 关键词检错 维吾尔语、哈萨克语、柯尔克孜语中的一个词是由若干个字母前后相连的字母联体, 字符集中相似字母较多, 拼写出错率较高, 再加上各地人民发音习惯上的差异, 很容易产生拼写错误。因此, 为了快速、正确地搜索相关内容的网页, 对用户输入的关键词进行检错 (拼写检查) 是很有必要的。在研究中我们收集了大量的词语, 分别创建了维吾尔语词语库、哈萨克语词语库和柯尔克孜语词语库作为检错依据。从词语库中查找每一个关键词, 如找到则是正确的, 否则是错误的。

· 关键词纠错 (候选词选择) 当用户输入的关键词出现拼写错误时, 搜索引擎Retrieval Server应该给用户返回拼写错误提示或者给用户返回若干个候选关键词让用户再次确定, 保证搜索关键词是正确的, 搜索结果也是正确的。

在研究中, 为了提高纠错效率, 我们统计并收集了一般拼写出错率95%以上的大约六千个单词的错误拼写和正确拼写, 并建立了对照词语库。我们的算法是:首先从对照词语库中查找拼写错误的关键词, 如找到, 则直接得到正确的关键词, 如果不在对照词语库中, 那么用最小编辑距离算法和长度优先算法找到与用户输入的关键词最接近的若干个 (本算法中限定为5个) 候选词并返回给用户。两个符号串之间的最小编辑距离是指把一个符号串转换为另一个符号串时所需的最小编辑 (插入、删除和替换) 操作次数。例如, “”和“”之间的编辑距离是1 (一个字符替换操作) , 我们根据最小编辑距离的大小和字符长度匹配, 给用户返回匹配概率最大的5个候选词, 让用户再次确定。

· 词根切分 维吾尔语、哈萨克语和柯尔克孜语都是一种黏性语言, 在这一类语言中词 (word) 是最小的独立运用的语言单位。词是由词根和附加成分构成。如:用户输入的维吾尔文关键词“” (中国的人口) , 其中, 搜索引擎应该能够搜索包含词根“” (中国) 和“” (人口) 的所有网页。因此, 设计高准确率的切分算法对关键词进行词根切分, 能够给用户提供比较全面的搜索结果是本搜索引擎Retrieval Server关键技术之一。 在设计中, 分别创建了维吾尔文词根库、哈萨克文词根库和柯尔克孜文词根库作为主要的切分依据。

· 同化 (弱化) 处理 如果关键词没有拼写错误或者有错误但是已经纠正过来以后, 通过词根切分算法还是找不到词根, 那就表明该词中产生同化现象。同化是指有的维、哈、柯文词根连接某些词缀时其词根最后一个音节的有些字母 (元音或辅音) 被替换成另外一些字母。如:维文词根连接某些词缀时其词根最后一个音节的“”, “”字母被替换成“”或“”字母, 这种现象称元音同化。解决同化问题是维、哈、柯文搜索引擎Retrieval Server的技术重点也是难点。在我们的算法中首先进行音节分解, 然后从最后一个音节开始检查, 如音节中有元音字母“”或“”, 分别替换成“”和“”, 这一过程我们称复原。对复原过来的音节再进行重组, 然后再进行词根切分。

· 提取网页相关内容、格式处理、返回搜索结果 用户提交关键词并经过关键词预处理模块并提取关键词词根之后, Retrieval Server激活通信模块跟索引器 (Indexer) Socket连接, 将关键词词根发送给索引器并从索引器得到与关键词相关的索引值, 包括该关键词出现的网页个数, 前十个网页在数据库中的ID号, 每一个网页中关键词出现的个数、位置、长度等信息, 然后交给本模块处理。本模块根据索引信息从数据库提取每个网页ID号对应的网页标题、URL和网页内容。然后再根据关键词在本网页中的出现次数、出现位置、长度等信息提取前五个关键词和每个关键词前后部分内容构成长度为600个字符的网页摘要, 再加上网页标题、URL等内容生成搜索结果页面返回给用户。

4 结束语

该搜索引擎已经以www.tapkak.com为域名开始提供维、哈、柯文信息检索服务, 得到了广大维吾尔族、哈萨克族、柯尔克孜族网络用户的认可, 成为了新疆地区唯一的少数民族语种的全文搜索引擎, 弥补了新疆地区民文网络信息检索技术领域中的空白。

总的来说, 我们设计的这个搜索引擎系统除了包含现有信息检索技术的很多方面, 还涉及到少数民族语言文字计算机处理关键技术。尽管有些方面做得不是很好, 但是我们会在进一步的工作中对它们进行改进和优化, 并对其功能进行扩充, 例如对用户查询的处理添加语义理解, 使得检索结果更加精确, 对文档的索引机制进行改进等。

参考文献

[1]李晓明, 闫宏飞, 王继民.搜索引擎——原理、技术与系统[M].科学出版社, 2005, 4 (1) :20-27.

[2]杜亚军, 严兵, 宋亮.爬行虫算法设计与程序实现[J].计算机应用, 2004, 24 (1) :33-35.

[3]吴鹏飞, 孟祥增, 刘俊晓, 等.基于结构与内容的网页主题信息提取研究[J].山东大学学报:理学版, 2006, 41 (3) :131-134.

[4]贾崇, 陆玉昌, 鲁明羽.一种支持高效检索的即时更新倒排索引方法[J].计算机工程与应用, 2003, 29:198-201.

[5]米吉提.阿不力米提.在多文种环境下的维吾尔语文字校对系统的开发研究[J].系统工程理论与实践, 2003, 23 (5) :117-124.

[6]古丽拉.阿东别克, 米吉提.阿布力米提.维吾尔语词切分方法初探[J].中文信息学报, 2004, 18 (6) :61-65.

全文搜索引擎 篇2

关键词:农作物生产技术服务平台,Lucene.net,中文分词

传统的农作物栽培过程中,农民种植大多凭借个人的主观经验,或靠农技人员的手口相授,农户之间的口口相传,没有形成完整的生产技术知识体系,严重影响了农作物的产量。针对这一现状,提出建设农作物生产技术服务平台。平台主要提供各种涉农信息及农业生产新技术的普及,方便农户查询、学习先进生产技术、病虫害防治技术,并应用于生产实践。在功能上,除了实现业务功能之外,还需为农户提供高效的对生产技术、病虫草害防治技术的查询检索功能。

基于上述需求,传统的解决方案是通过全文检索来提供对信息的查询功能。但传统的全文检索是以文档的全部文本信息作为检索对象的一种信息检索技术。不考虑文档的具体内容而仅仅判断是否包含被检索关键词,灵活性不强。本文针对上述需求及传统解决方案的不足,基于Lucene.Net设计和实现了农作物生产技术服务平台全文搜索引擎。

1 农作物生产技术全文搜索引擎的框架设计

我们在数据访问层开发满足上述需求的搜索引擎,通过对Lucene.Net的操作接口和数据访问接口的封装,为农户对生产技术、病虫草害防治技术的检索提供查询接口。

1.1 农作物生产技术知识获取与知识库的建立

平台数据的表现形式主要分为描述性文本数据和图谱数据及视频数据三类。以现有农作物科技信息作为平台系统的知识基础,选取领域农业专家正式出版的教材、图谱和视频等信息资源,围绕农作物生长的各个阶段进行划分,总结、提炼形成描述性文本数据的知识库。将图谱和视频资源构成多媒体数据库。在搜索引擎中,对于图谱和视频资源可以将图片和视频中的文字提取出来,然后按文字来索引图谱和视频。

1.2 基于关键词的索引的建立

为便于搜索,在知识库的组织形式上,将平台中所有的数据资源分类编号形成索引。索引算法的好坏直接影响平台的响应速度和农户查询结果的质量。本平台采用的是以关键词为单位进行索引的建立,有效提高查全率和查准率。Lucene.net采用倒排索引,记录关键词的所属文档和在文档中的位置及频率。创建关键词索引时,按关键词顺序从小到大写入字倒排文件中,然后按词顺序将相应的索引信息顺序写入索引倒排文件中。

关键词的提取主要从以下几个方面判断:利用TF[1]*IDF[2],统计词频和词在所有文档中出现的总次数;标题中出现的词比内容中的词更重要;利用位置信息;把出现的名词按语义聚类,提取出有概括性的词作为关键词。

1.3 中文分词算法的选择

本平台中利用Lucene.net提供的中文分词接口实现农作物技术服务平台特有的中文分词模块,实现对农作物品种名、病虫草害名、症状、使用的农药多个关键词的组合来完成非精确推理。

目前常用的中文分词算法有基于字符串匹配的分词法、基于统计的分词法、基于理解的分词法和基于语义的分词法。本平台采用的是基于字符串匹配的分词法,又叫机械分词法,按照一定的策略将待匹配串与一个特定词库进行匹配,若在词库中找到某个字符串,则匹配成功(识别)一个词。根据分词库、匹配原则和扫描顺序的不同,又可分为:最大正向匹配分词法、最大逆向匹配分词法、双向匹配分词法、全切分算法等。

本平台采用Lucene中提供的位置匹配算法“检索词首字直接匹配算法”。首先使用“折半查找”在字表中找字,再在字表中检索以该字为首字的词,采用正向减字最大匹配算法,快速查找该词,得到其在数据库中的标记号和位置值,从而在索引文件中找到该词,定位到具体记录,找到目标结果。

1.4 检索结果排序的改进

Lucene在Index Searcher中提供了一个explain方法,返回检索结果每一条文档的详细评分内容。通过调整或者修改排序算法、增减不同文档的权值,可以达到我们期望的排序结果。

评分公式如下:

Score(q,d)=coord(q,d)*query Norm(q)*∑(tf(t in d)* idf(t)*get Boost(t.field in d)*length Norm(t.field in d)

其中文档频率tf(t in d)是每个(t:term)在结果文档(d)中出现的次数,idf(t)是检索匹配文档数量的反向函数,Boost因子是索引项的权重,length Norm长度因子是某个索引词在域中的总长度决定的。query Norm是调节因子,让排序结果在不同查询条件之间可以比较。Coord函数是一个协调因子,表示文档(d)中term(t)出现的百分比。

在农作物技术检索的实际应用中,可以通过实现Lucene中的Sort Comparator Source接口和Score Doc Comparator接口来完成自定义排序的功能。

2 农作物生产技术全文搜索引擎的实现

本文通过扩展Lucene.Net的分词接口,采用基于字符串匹配的中文分词算法来实现农作物生产技术服务平台的中文分词模块。

2.1 创建索引

创建一个提供全文检索功能的索引库,使用FSDirectory类指定索引库文件存放的位置。首先,使用Index Writer类来写索引文件,其中参数Analyzer是对文档进行词法分析和语言处理的。这里使用的是Pangu Analyzer。

其次,创建一个Document用来表示要索引的文档。

然后,将不同的Filed通过Add(Field field)添加到文档中。

最后,使用Index Writer对象调用add Document将索引写到索引文件中。

2.2 实现搜索

农作物技术服务平台需实现对农作物品种名、病虫草害名、症状等多个关键词的组合查询。在搜索生产技术的过程中,农户经常会使用一些当地的俗语。通过同义词搜索来实现语义扩展搜索。实现的方法是通过查询扩展方式来实现。比如当农户输入“番茄”搜索的同时,通过查找同义词库,按照“西红柿”、“番茄”、“洋柿子”等多个同义词查找。当农户输入“除草剂”的同时,也能按照“乙草胺”、“甲草胺”等进行下位词的扩展。

实现语义搜索的基本步骤如下:

1)准备农作物生产技术相关的语义词库,使用同义词词林的格式;

2) 把语义词库按s(synset_id,w_num,'word',ss_type,sense_number,tag_count)转换成wn_s.pl格式,再转换成Lucene同义词索引库;

3)通过Synonym Analyzer调用这个同义词索引库来实现同义词扩展查找。

使用Index Searcher类实现搜索功能。其方法Search包括(查询条件Query,过滤条件Filter,检索过后存放容器Collector)。Phrase Query用于多个关键词的拼接类,且关键词间是and(且)的关系。Boolean Query实现关键词间的or(或)关系。

2.3 自定义搜索结果

通过实现Sort Comparator Source接口来完成农作物生产技术搜索结果的自定义排序功能。我们定义搜索结果先按匹配相似度排序,再按时间排序。

Lucene.Net.Search.Sort Field[] sort F =

new Sort Field[]{Lucene.Net.Search.Sort Field.FIELD_SCORE,

new Lucene.Net.Search.Sort Field("postdate",

Lucene.Net.Search.Sort Field.STRING,true)};

Lucene.Net.Search.Sort score Sort=new

Lucene.Net.Search.Sort(sort F);

hits = searcher.Search(query, score Sort);

3 总结

本文针对农作物生产技术服务平台全文搜索的需要,基于对Lucene.Net的全文检索关键技术的研究,在此基础之上对其分词、索引建立、检索结果排序和检索效率进行了改进和优化。在数据访问层之上,设计实现了一个提供多种检索方式的农作物生产技术服务平台全文检索引擎的框架,为农户检索农作物技术提供了极大的便利。

参考文献

[1]李光敏.文献搜索引擎中特征项及权重的应用[J].计算机系统应用,2014,23(5):188-191.

[2]吴青,夏红霞,赵广辉,刘春燕.基于Lucene全文检索引擎的应用与改进.武汉理工大学学报,2008,30(7):145-148.

[3]何国斌,赵晶璐.基于最大匹配的中文分词概率算法研究[J].计算机工程,2010,36(5):173-175.

全文搜索引擎 篇3

随着Internet网上的信息呈几何级数式的增长,搜索引擎已经成为用户浏览网络信息的首选。传统的通用搜索引擎(Google、Yahoo以及国内的Baidu等),作为一个辅助用户查找信息的工具已经成为大多数互联网用户访问网络的入口。但是,这些通用性搜索引擎存在着一定的不足,例如:通用搜索引擎的信息量较大、搜索深度不够、查询不太准确等问题。在这种情况下,为了解决这些问题,垂直搜索引擎应运而生。垂直搜索引擎是针对某一领域或行业的专业搜索引擎,是搜索引擎的延伸,可以为搜索用户提供符合专业用户操作行为的信息服务方式。它的特点是“专、精、深”,并且具有较强的行业色彩,和通用搜索引擎的海量信息无序化相比,垂直搜索引擎更加具体和深入。该文主要阐述开源的Lucene技术和Heritrix技术的基本原理和使用方法,提出了整合Lucene与Heritrix使其与J2EE平台完全融合的方案,并实现了一个手机产品垂直搜索引擎系统。

2 全文检索引擎开源框架

2.1 全文搜索工具包Lucene

Lucene是一个用Java编写的高效率、可扩展的全文索引的引擎工具包。它是目前最受欢迎的开源信息检索包。Lucene定义了平台无关的索引文件结构,保证了平台无关性。它的另外一个优秀之处在于设计结构十分优良,将所有的核心类库设计成抽象基类,用户使用Lucene时再具体实现其对应的抽象类。此外,Lucene使用类进行包装,然后进行基于面向对象的多层封装,最后形成一个低耦合、与平台无关的、可以进行二次开发的开源框架。要想使用Lucene来进行我们的开发,首先需要对Lucene的内部结构有比较清楚的了解。Lucene的结构图如图1所示。

目前已经有较多的应用程序(例如Eclipse的帮助系统的搜索功能)的搜索功能是基于Lucene的,Lucene可以为文本类型的数据建立索引,只要把要索引的数据格式转化的文本类型的数据格式,Lucene就可以对该文档进行索引和搜索。例如如果要对一些HTML文档或PDF文档进行索引,首先就需要把这些文档转化成文本格式的,再将转化后的内容交给Lucene进行索引,然后将创建好的索引文件保存到内存或磁盘中,最后根据用户输入的查询条件在索引文件上进行所需的查询。由于Lucene不需要指定将要索引的文档的格式,所以它基本上能够适用于所有的搜索应用程序。Lucene工具包的索引机制架构如图2所示。

2.2 开源web爬虫框架Heritrix

Heritrix是一个开源的由Java开发的Web网络爬虫框架,用户使用它可以从网络上抓取想要搜索的资源。Heritrix来自于开源组织www.archive.org,它的最出色之处在于可扩展性,开发者可以根据自己的需要,通过扩展它的各个组件来实现自己的抓取逻辑。Heritrix是一个开源的可以添加多种可交互组件的爬虫框架,各种不同的组件提供不同的功能,通过对基础框架的扩展,我们可以实现满足自己需要的定制爬虫程序。Heritrix架构示意图如图3所示。

Heritrix框架的各主要部件功能描述如下:

(1)抓取任务CrawlOrder组件:CrawlOrder是整个抓取任务的开始,在一次抓取过程中包含很多的属性,最简单的一种就是根据默认的配置文件order.xml来配置。Heritrix提供了XMLSettingsHandler类,它可以用来帮助读取order.xml。

(2)中央控制器CrawlController:CrawlController是Heritrix的核心组件,它控制决定着一个抓取任务的开始和结束。

(3)Frontier链接制造工厂:Frontier的主要功能是为线程提供URL链接的处理工厂,按照一定的复杂算法将网页中的URL进行处理,将需要处理的URL链接送入到处理器链中,同时还提供一定的日志和状态报告功能。Heritrix本身已经提供了非常强大的链接处理功能,该文中就不再对其进行扩展处理。

(4)Heritrix的多线程ToeThread和ToePool:Java语言对于多线程提供了良好的支持,heritrix是基于java语言开发的爬虫框架,自然对多线程的处理也提出了独特的方案。它提供了用于管理所有的抓取线程的一个标准的线程池ToePool,线程池本身在创建的时候并没有创建实例对象,只有在调用其Set()方法时才会根据传入参数的不同创建实例,管理线程池中线程数量的增减。ToeThread线程是为更有效更快速的抓取网页内容而设计的,因为爬虫抓取,分类,处理是一个异步的过程,只有使用多线程才能让多个处理部分同时工作,提高效率。

3 系统设计及实现

3.1 系统架构设计

为了阐述基于Java的开源框架Lucene和Heritrix在全文搜索系统中的应用,该文实现了一个简单的手机产品的搜索引擎系统。用户通过本系统在网站上搜索他们所需要的手机的详细信息,并可以从搜索结果中打开一个页面进行浏览,了解手机的详细信息。在我们这个应用中,首先需要通过网络爬虫Heritrix将这些手机信息抓取下来,进行组织和整理,构建手机产品数据库,同时为手机的各种内容(如手机图片、手机详细资料等),利用Lucene来建立索引,以便提供给用户来进行查找。Web用户接口主要通过Spring,Struts等流行web框架来设计。完整的手机搜索系统的整体结构框架如图4所示。

3.2 系统实现

系统的设计步骤如下:

首先需要对目标页面的结构进行分析,获取爬虫程序的资源抓取清单,爬虫程序对页面抓取完毕后,使用HTMLParser等超文本分析工具对抓取的网页进行解析,获取手机名称,型号,属性信息,图片地址等内容,利用这些内容生成手机信息文件,并对所有手机产品构建出一个关于手机产品信息的词库,这个词库包含了被抓取的所有手机的型号与品牌,用户输入关键词时就能够搜索到这些信息。产品信息词库建立好后,再将这些信息插入到数据库中,建立Lucene的索引。系统运行效果如图5所示。

4 总结

垂直搜索引擎技术越来越受到众多开发者的重视,用户通过它可以获得更有效准确的信息检索服务。该文分析了Lucene的索引机制,探讨了Heritrix的结构框架,最后设计开发了一个简单的手机产品的搜索引擎系统,利用Lucene和Heritrix,在应用程序添加高效的索引和搜索能力成为可能。随着当前互联网和实际应用中大量数据的出现,用户更加需要从这些海量数据中提取出有用的信息,搜索引擎将变得越来越重要,基于和的全文搜索系统将得到更加广泛的应用。

参考文献

[1]Otis Gospodnetic,Erik Hatcher.Lucene in Action(中文版)[M].北京:电子工业出版社,2007.

[2]Apache Lucene Project[EB/OL].http://jakarta.apache.org/lucene/.2009.

[3]Apache Software Foundation.Lucene Query Syntax[EB/OL].http://lucene.apache.org/java/docs/.2009.

[4]卢亮.搜索引擎原理、实践与应用[M].北京:电子工业出版社,2007.

[5]Baeza Yates R,Ribeiro Neto B.Modern Information Retrieval[M].北京:机械工业出版社,2004.

全文搜索引擎 篇4

1 Lucene是什么?

Lucene目前已经被广泛应用于全文索引/全文检索的项目。值得注意的是Lucene并不是一个完整的全文检索引擎, 而是一个全文检索引擎的架构, 是Apache软件基金会Jakarta项目组的一个子项目, 是一个开放源代码的全文检索引擎工具包。Lucene提供了完整的查询引擎和索引引擎, 部分文本分析引擎 (英文与德文两种西方语言) 。Lucene的目的是为软件开发人员提供一个简单易用的工具包, 以方便的在目标系统中实现全文检索的功能, 或者是以此为基础建立起完整的全文检索引擎。

2全文检索系统

全文检索是指计算机索引程序通过扫描文章中的每一个词, 对每一个词建立一个索引, 指明该词在文章中出现的次数和位置, 当用户查询时, 检索程序就根据事先建立的索引进行查找, 并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。

全文检索系统是按照全文检索理论建立起来的用于提供全文检索服务的软件系统。一般来说, 全文检索需要具备建立索引和提供查询的基本功能, 此外现代的全文检索系统还需要具有方便的用户接口、面向WWW的开发接口、二次应用开发接口等等。功能上, 全文检索系统核心具有建立索引、处理查询返回结果集、增加索引、优化索引结构等等功能, 外围则由各种不同应用具有的功能组成。结构上, 全文检索系统核心具有索引引擎、查询引擎、文本分析引擎、对外接口等等, 加上各种外围应用系统等等共同构成了全文检索系统。图1.1展示了上述全文检索系统的结构与功能。

在上图中, 我们看到:全文检索系统中最为关键的部分是全文检索引擎, 各种应用程序都需要建立在这个引擎之上。一个全文检索应用的优异程度, 根本上由全文检索引擎来决定。因此提升全文检索引擎的效率即是我们提升全文检索应用的根本。另一个方面, 一个优异的全文检索引擎, 在做到效率优化的同时, 还需要具有开放的体系结构, 以方便程序员对整个系统进行优化改造, 或者是添加原有系统没有的功能。比如在当今多语言处理的环境下, 有时需要给全文检索系统添加处理某种语言或者文本格式的功能, 比如在英文系统中添加中文处理功能, 在纯文本系统中添加XML或者HTML格式的文本处理功能, 系统的开放性和扩充性就十分的重要。

二、Lucene的应用和优势

1 Lucene的应用

作为一个开放源代码项目, Lucene从问世之后, 引发了开放源代码社群的巨大反响, 程序员们不仅使用它构建具体的全文检索应用, 而且将之集成到各种系统软件中去, 以及构建Web应用, 甚至某些商业软件也采用了Lucene作为其内部全文检索子系统的核心。apache软件基金会的网站使用了Lucene作为全文检索的引擎, IBM的开源软件eclipse的2.1版本中也采用了Lucene作为帮助子系统的全文索引引擎, 相应的IBM的商业软件Web Sphere中也采用了Lucene。Lucene以其开放源代码的特性、优异的索引结构、良好的系统架构获得了越来越多的应用。

2 Lucene的优势

Lucene作为一个全文检索引擎的架构, 其具有如下突出的优点:

(1) 索引文件格式独立于应用平台。Lucene定义了一套以8位字节为基础的索引文件格式, 使得兼容系统或者不同平台的应用能够共享建立的索引文件。

(2) 在传统全文检索引擎的倒排索引的基础上, 实现了分块索引, 能够针对新的文件建立小文件索引, 提升索引速度。然后通过与原有索引的合并, 达到优化的目的。

(3) 优秀的面向对象的系统架构, 使得对于Lucene扩展的学习难度降低, 方便扩充新功能。

(4) 设计了独立于语言和文件格式的文本分析接口, 索引器通过接受Token流完成索引文件的创立, 用户扩展新的语言和文件格式, 只需要实现文本分析的接口。

(5) 已经默认实现了一套强大的查询引擎, 用户无需自己编写代码即使系统可获得强大的查询能力, Lucene的查询实现中默认实现了布尔操作、模糊查询 (Fuzzy Search) 、分组查询等等。

面对已经存在的商业全文检索引擎, Lucene也具有相当的优势。

首先, 它的开发源代码发行方式 (遵守Apache Software License) , 在此基础上程序员不仅仅可以充分的利用Lucene所提供的强大功能, 而且可以深入细致的学习到全文检索引擎制作技术和面相对象编程的实践, 进而在此基础上根据应用的实际情况编写出更好的更适合当前应用的全文检索引擎。在这一点上, 商业软件的灵活性远远不及Lucene。

其次, Lucene秉承了开放源代码一贯的架构优良的优势, 设计了一个合理而极具扩充能力的面向对象架构, 程序员可以在Lucene的基础上扩充各种功能, 比如扩充中文处理能力, 从文本扩充到HTML、PDF等等文本格式的处理, 编写这些扩展的功能不仅仅不复杂, 而且由于Lucene恰当合理的对系统设备做了程序上的抽象, 扩展的功能也能轻易的达到跨平台的能力。

最后, 转移到apache软件基金会后, 借助于apache软件基金会的网络平台, 程序员可以方便的和开发者、其它程序员交流, 促成资源的共享, 甚至直接获得已经编写完备的扩充功能。最后, 虽然Lucene使用Java语言写成, 但是开放源代码社区的程序员正在不懈的将之使用各种传统语言实现 (例如.net framework) , 在遵守Lucene索引文件格式的基础上, 使得Lucene能够运行在各种各样的平台上, 系统管理员可以根据当前的平台适合的语言来合理的选择。

对于中文用户来说, 最关心的问题是其是否支持中文的全文检索。由于Lucene良好的架构设计, 对中文的支持只需对其语言词法分析接口进行扩展就能实现对中文检索的支持。在最新的Lucene1.5版本中, 就已经加入了对中文等亚洲语言的支持。

三、Lucene的结构

1 Lucene的包结构

Lucene是开放源代码的工具包, 可以在jakarta项目组的相关主页中查找到它的下载。Lucene源码中总共包括7个子包 (又称模块) , 分别是analysis、document、index、query Parse、search、store、util, 每个包都完成特定的功能, 见下表:

通过对源码的功能分析我们可以进一步得出Lucene的核心类包主要有3个, 即为org.apache.lucene.analysis、org.apache.lucene.index、org.apache.lucene.search这三个。

其中org.apache.lucene.analysis主要用于切分词, 切分词的工作由Analyzer的扩展类来实现, Lucene自带了StandardAnalyzer类, 我们可以参照该写出自己的切词分析器类, 如中文分析器等。

org.apache.lucene.index主要提供库的读写接口, 通过该包可以创建库、添加删除记录及读取记录等。

org.apache.lucene.search主要提供了检索接口, 通过该包, 我们可以输入条件, 得到查询结果集, 与org.apache.lucene.query Parser包配合还可以自定义的查询规则, 像google一样支持查询条件间的与、或、非、属于等复合查询。

2 Lucene的系统结构组织

Lucene的功能很强大, 但从根本上说, 主要包括两块:一是文本内容经切词后索引入库;二是根据查询条件返回结果。下图为Lucene系统的结构组织, 并给出系统结构与源码组织图。

从图中我们清楚的看到, Lucene的系统由基础结构封装、索引核心、对外接口三大部分组成。其中直接操作索引文件的索引核心又是系统的重点。Lucene的将所有源码分为了7个模块 (在java语言中以包即package来表示) , 各个模块所属的系统部分也如上图所示。需要说明的是org.apache.lucene.query Paser是做为org.apache.lucene.search的语法解析器存在, 不被系统之外实际调用, 因此这里没有当作对外接口看待, 而是将之独立出来。

从面象对象的观点来考察, Lucene应用了最基本的一条程序设计准则:引入额外的抽象层以降低耦合性。首先, 引入对索引文件的操作org.apache.lucene.store的封装, 然后将索引部分的实现建立在 (org.apache.lucene.index) 其之上, 完成对索引核心的抽象。在索引核心的基础上开始设计对外的接口org.apache.lucene.search与org.apache.lucene.analysis。在每一个局部细节上, 比如某些常用的数据结构与算法上, Lucene也充分的应用了这一条准则。在高度的面向对象理论的支撑下, 使得Lucene的实现容易理解, 易于扩展。

Lucene在系统结构上的另一个特点表现为其引入了传统的客户端服务器结构以外的的应用结构。Lucene可以作为一个运行库被包含进入应用本身中去, 而不是做为一个单独的索引服务器存在。这自然和Lucene开放源代码的特征分不开, 但是也体现了Lucene在编写上的本来意图:提供一个全文索引引擎的架构, 而不是实现。

四、Lucene的倒排文档索引原理

1 Lucene的索引存储

Lucene存放索引信息的是文件。它的索引存储文件设计的比较通用, 输入输出结构都很像数据库的表→记录→字段, 所以很多传统应用的文件、数据库等都可以比较方便地映射到Lucene的存储结构/接口中。它的索引存储文件结构描述如下:

1) 基本定义。

Lucene的基本概念为:索引 (Index) 、文档 (Document) 、字段 (Field) 、术语 (term) 。索引由一个文档序列组成;文档由一个个字段序列组成;字段由一个命名的术语序列组成;术语由字符串构成。

2) 字段类型。

Lucene中的字段有三个重要的属性:

A可分词性:表示字段内容被分成多个可被索引的词 (token) 。每个词是一个术语。当某个字段不分词时, 整个字段内容作为一个术语。

B可存储性:表示字段内容是直接按字词存放, 而不是以到排形式存放。

C可索引性:表示字段内容以到排形式存放, 即:记录了字段的每个术语在某一文档的出现频率。

这三个属性不具有互斥性, 字段可以同时被到排、索引和分词。

3) 段

Lucene索引可以由多个子索引 (即:段) 组成。每段是个完全独立的索引, 可以被独立搜索。索引可以通过两种方式演化:为新增加的文档创建新的段;合并已存在的段。每个段索引包含有:字段名 (Filed names) :在索引中所用到的字段名的集合;存储字段值:存储字段值的集合 (存储字段值是文档的一些辅助存储属性, 如:title, url) ;术语字典 (Term Dictionary) :存放用在所有文档中的所有索引字段的术语, 也包含了拥有该术语的文档数, 和指向该术语频率数据与位置数据的指针;术语的频率数据:包含每个术语的文档数和该术语在文档中的频率;术语位置数据:对在字典中的每个术语, 记录了术语在每个文档中的位置;标准化因子:对每个文档的每个字段, 该值与它的得分值相乘得到最后的分值;删除表:记录了已被逻辑删除但没有物理删除的文档。段都存放在一个索引目录下。

2 Lucene索引结构和算法

Lucene使用的是倒排文件索引结构。该结构及相应的生成算法如下:

首先设有两篇文章1和2

文章1的内容为:Tom lives in Guangzhou, I live inGuangzhou too.

文章2的内容为:He once lived in Shanghai.

4.2.1索引关键词的获取

由于lucene是基于关键词索引和查询的, 首先我们要取得这两篇文章的关键词, 通常我们需要如下处理措施:

a.我们现在有的是文章内容, 即一个字符串, 我们先要找出字符串中的所有单词, 即分词。英文单词由于用空格分隔, 比较好处理。中文单词间是连在一起的需要特殊的分词处理。

b.文章中的“in”, “once”, “too”等词没有什么实际意义, 中文中的“的”“是”等字通常也无具体含义, 这些不代表概念的词可以过滤掉。

c.用户通常希望查“H e”时能把含“he”, “H E”的文章也找出来, 所以所有单词需要统一大小写。

d.用户通常希望查“live”时能把含“lives”, “lived”的文章也找出来, 所以需要把“lives”, “lived”还原成“live”。

e.文章中的标点符号通常不表示某种概念, 也可以过滤掉。

在lucene中以上措施由Analyzer类完成。

经过上面处理后 (关键词用[]括起) ,

文章1的所有关键词为:[tom][live][guangzhou][i][live][guangzhou]

文章2的所有关键词为:[he][live][shanghai]

4.2.2建立倒排索引

有了关键词后, 我们就可以建立倒排索引了。上面的对应关系是:“文章号”对“文章中所有关键词”。倒排索引把这个关系倒过来, 变成:“关键词”对“拥有该关键词的所有文章号”。文章1, 2经过倒排后变成:

但是仅知道关键词在哪些文章中出现还不够, 我们还需要知道关键词在文章中出现次数和出现的位置, 通常有两种位置:a) 字符位置, 即记录该词是文章中第几个字符 (优点是关键词亮显时定位快) ;b) 关键词位置, 即记录该词是文章中第几个关键词 (优点是节约索引空间、词组 (phase) 查询快) , lucene中记录的就是这种位置。

加上“出现频率”和“出现位置”信息后, 我们的索引结构变为:

以live这行为例我们说明一下该结构:live在文章1中出现了2次, 文章2中出现了一次, 它的出现位置为“2, 5, 2”这表示什么呢?我们需要结合文章号和出现频率来分析, 文章1中出现了2次, 那么“2, 5”就表示live在文章1中出现的两个位置, 文章2中出现了一次, 剩下的“2”就表示live是文章2中第2个关键字。

以上就是lucene索引结构中最核心的部分。我们注意到关键字是按字符顺序排列的 (lucene没有使用B树结构) , 因此lucene可以用二元搜索算法快速定位关键词。

参考文献

[1].车东, 在应用中加入全文检索功能——基于Java的全文索引引擎Lucene简介, http://www.chedong.com/tech/lucene.htm

[2].高琰, 《基于Lucene的搜索引擎设计与实现》, 微机发展, 2004 (10)

[3].开放源代码的全文检索引擎Lucene——介绍、系统结构与源码实现分析, http://www.lucene.com.cn/about.htm

[4].Lucene倒排索引原理, http://www.lucene.com.cn/yanli.htm

[5].周宁, 《基于Lucene/XML的全文检索机制研究》, 图书情报知识, 2005 (6)

上一篇:转变基层医学模式下一篇:园林工程造价与招投标