Lucene全文检索(精选6篇)
Lucene全文检索 第1篇
1 系统设计
1.1 系统的总体设计思路和结构图
系统用Lucene API生成一次索引,搜索时可以将关键字定位到具体文档。由于PDF文档的结构性较好,利用开源工具PDFBox API可以从PDF文档中分页提取文本,并且还可以提取文本在页面中的坐标位置,所以可以给PDF文档做更为精确的二次索引,将关键字定位到PDF具体页面。系统的总体结构图如图1所示[1]。
2 系统实现
2.1 一次索引的实现
为了对文档进行索引操作,Lucene提供了五个基础的类,分别是Document,Field,IndexWriter,Analyzer,Directory,通过这几个类可实现对文档的一次索引[2]。本文针对某一目录下PDF文档建立索引的核心代码如下[3]:
2.2 一次检索的实现
对文档建立好索引后,就可以对这些文档进行查询了,Lucene提供了几个基础的类来完成这个过程,它们分别是Query,Term,TermQuery,IndexSearcher,Hits。通过这几个类实现对文档的一次检索,把检索定位到具体的文档[4]。实现一次检索操作的核心代码如下[5]:
2.3 二次索引核心算法的实现
2.3.1 二次索引概述
系统对PDF文档提供了更深层次的检索,可将检索结果定位到书籍的具体页,并在页面标示出关键字的具体位置。该层次的检索用Lucene API是无法实现的。本文定义了一种二次索引组织方式,二次索引组织格式是“Book_idJHJkeywordJHJpageJHJ以逗号隔开的X,Y坐标JHJ关键词出现的上下文”。当关键词在页面可以出现多次时,这样多个坐标间用"|"隔开,坐标单位为像素,代表关键词以文档左上角为原点的水平向右和垂直向下方向上的距离。同样其多个上下文之间也用"|"隔开。如下为一条存于文本文件中的二次索引示例:
B002JHJ北京JHJ28JHJ275,102JHJ略重点,先后在北京、曼谷、东京、香港
这条二次索引表示编号为“B002”的书籍中“北京”关键词存在于第28页,该关键词的坐标为“275,102”(单位:像素),关键词出现的上下文为“略重点,先后在北京、香港、曼谷、东京”。
2.3.2 二次索引的实现
二次索引是通过对PDF文档进行深入解析后生成的,调用PDFBox API对PDF文档进行解析,在解析过程中对PDF文档分页提取文本,再对提取的文本分词后做索引,先将生成的二次索引先存储到文本文档中,然后再将文本格式的二次索引文件导入到数据库即可。
2.4 二次检索的实现
用户查询在提交数据库查询之前,首先需要进行文本分析,对用户的查询语句进行分词。将分词后的多个结果提交数据库查询。然后对查询返回的多个二次索引结果集按照布尔逻辑关系合并,并对合并后的结果集进行排序。反馈给用户的是按照页码进行排序的二次索引集。二次检索的效果如图2所示,图中所有“北京”关键字都用不同的颜色进行了标示。
3 总结和展望
本全文检索系统在J2EE环境下实现,所用数据库为Mysql,运行环境为Tomcat。系统曾作为某企业网站资料全文检索系统投入试用,取得了一定的应用成果。虽然本系统离真正的智能化系统还有一定的距离,但相信随着应用需求的推动和计算机技术的进步,必将有更广阔的应用前景。
摘要:通过Lucene API和PDFBox API实现对PDF文档的二次全文检索。为了实现精确的搜索关键词定位,本文设计并实现了一种新的二次索引算法,该二次索引带有关键词的页码、坐标及其上下文等信息。利用该二次索引可将检索结果定位到PDF文档的具体页,然后在页面上标示出关键字的具体位置,使对PDF文档的二次检索达到了类似百度文库的全文检索效果。
关键词:全文检索,二次索引,二次检索,Lucene
参考文献
[1]郑轶媛.基于J2EE的站内搜索引擎的研究[D].上海交通大学.2005.1:8-13
[2]吴众欣,沈家立.Lucene分析与应用[M].北京:机械工业出版社,2008.9
[3]邱哲,符滔滔.开发自己的搜索引擎——Lucene 2.0+Heriterx[M].北京:人民邮电出版社,2007.6
[4]高斯帕那,哈特赫(著),谭鸿,黎俊鸿等(译).Lucene IN ACTION中文版[M].北京:电子工业出版社,2007.1
Lucene全文检索 第2篇
关键词:全文检索,系统设计,Lucene,计算机技术
Web搜索引擎技术是当今网络信息处理领域的一个热点和难点。Web可以看作是一个庞大的分布式网络数据库,对于这样一个信息量飞速增长的数据库,如果人工地去检索和分类整个Web将是一项非常巨大的工程,因此需要构建一个合理的搜索引擎技术。
1 系统功能需求分析
本文设计与开发一个基于Lucene的校内资源搜索引擎系统,该系统特点是:
(1)在系统功能上,由Crawl Manager控制网络爬虫(Spider)多线程并发遍历校园网,每个Spider根据HTTP协议中的Type字段自动找到相应解析器(Parser)解析资源,解析器将解析后的Resource对象传递给索引(Index)模块进行索引,实现校内资源网络的抓取过程。
(2)在抓取过程中能尽可能过滤重复url,能够根据IP模块的功能过滤不符合规则的IP地址的网络节点,能够在抓取过程中统计信息,分析系统运行状态。
2 系统开发工具
Lucene是一个基于Java的全文信息检索工具包,它不是一个完整的搜索应用程序,而是为你的应用程序提供索引和搜索功能。Lucene目前是Apache Jakarta家族中的一个开源项目。也是目前最为流行的基于Java开源全文检索工具包。本项目采用Eclipse 3.3代号为Europa的集成开发环境(IDE)进行辅助开发。
3 系统结构设计与实现
3.1 系统模块设计
本系统侧重点是对校内资源的抓取,一共包括Ip,Index,Parser,test,xml,util,xml,db 7个模块以及一个配置文件Confi gs.xml。
(1)IP模块:主要功能是判断给定一个ip地址是否在所定义的ip范围之内。
(2)Index模块:主要功能是对内容进行索引。
(3)DB模块:主要功能是保存搜索过程中的信息,包括保存访问过的节点和未访问的节点。
(4)Parser模块:主要功能是解析各式各样资源,将不同种类型的资源转化为统一的资源模型进行索引。
(5)Test模块:主要功能是单元测试,辅助开发和调式过程,Test分布在各个模块中。
(6)Xml模块:主要功能是读取XML配置文件。
(7)Util模块:主要包括一些全局性的辅助静态方法。例如在各个模块提供一些内容或者格式上的转换。
(8)Confi gs.xml是系统的配置文件,包括一些索引目录,解析器配置等信息。
3.2 系统工作原理与搜索流程
系统接口调用关系如图1所示。
系统流程图(见图2)。
(1)在整个系统中,首先初始化各个模块和运行参数,将根节点加入节点列表中。
(2)在搜索过程中,首先取出一个节点,如果其符合一切条件(例如不为空,未在已经搜索过的列表中且IP地址属于定义范围之内),新建一个Spider实例用于搜索节点。Spider首先创建一个列表用于跟踪节点内部Url地址的访问情况,然后会自动创建线程用于并发搜索节点内部Url地址,如果列表不为空每个线程首先根据HTTP协议中的Type字段获得相应的解析器(Parser),用解析器解析相应资源获得Resource对象,并将其传递给Index模块进行索引,完成一次索引过程。如果内部列表为空说明整个节点索引过程已经完成,等待父线程继续分配。
整个抓取过程中对Html数据流见图3。
3.3 模块设计与分析
3.3.1 IP模块
Ip模块在整个系统中略似过滤器的作用,将不符合条件的主机地址过滤。IP模块读取Confi gs.xml中的IP规则,并且判断给定IP是否符合规则。
address是一个model类,定义了三种IP规则:范围(Range),单点(Single)和排除(Except)。用2个boolean变量(is Single,is Except)来判断节点类型。
3.3.2 Util模块
Util是一些辅助方法构成的模块,提供一些静态方法(Static)方便功能调用。Util在整个系统中并没有很明确的位置,编写Util模块也是为了在不同模块不同条件下调用一些静态方法。Regex Match类主要作用是利用正则表达式做一些对文本的修整或提取功能。
3.3.3 Parser模块
Parser的作用是构建解析器,也就是把一系列资源解析成Index.Resource对象然后递交给Indexer用于索引。Parser根据资源类型,资源位置的不同而不同,因此需要设计一个可扩展框架。
3.3.4 XML模块
Xml模块是针对系统需要,基于dom4j的再封装。XML模块所提供的功能方法分布在其它各个模块中,每个模块中的Confi g Reader类都要借助xml模块进行具体值的抽取。
3.3.5 DB模块
DB模块主要是存储抓取过程中的信息,具体的是存储URL与节点的任务列表,标识URL完成度。整个DB模块实现上使用了两套不同的技术,一种是以List为主的纯内存解决方案,还有一种是以Berkeley DB为主的内存数据库解决方案。
3.3.6 Crawl模块
Crawl模块是整个系统中的核心模块。Crawl模块作用是组织网络爬虫,获取网络资源,维持网络链接,统计信息作用。
4 系统性能测试
4.1 测试环境
(1)主要硬件环境:Intel Pentium D 2.8G with 2 Cores;2G DDR2
(2)软件环境:Windows 2003 R2 Enterprise Edition SP2;JDK 5.0
(3)测试工具:Eclipse TPTP与Net Beans Profi le
4.2 测试结果
通过比对线程数的效率,测试结果显示查询速度快,但也存在一定的问题,比如Lucene对索引做了大量的优化和改善,但涉及到磁盘操作仍是整个系统最慢的环节,因此,在运用Lucene的时候,应该尽可能的首先将索引写到内存中,然后再写到磁盘上,其次,在写磁盘的时候,应该尽可能一次性写大量数据,尽可能减少系统在磁盘操作上的消耗。此外,在Ioc方面,在需要效率的地方应该考虑直接创建对象或者用反射的方式来获取实例。增加模块的灵活性会降低系统的运行效率。在不需要太多效率的地方应该考虑使用这些依赖注入框架。
5 结束语
在系统设计中,框架的选择只有选择最合适的才有助于设计出来的系统运行流畅。在功能实现上,应着眼于效率问题。本文就基于Lucene的校内资源搜索引擎系统进行了设计与实现,以期为此类研究与应用提供有益参考。
参考文献
[1]陈立.全文检索引擎的设计研究[J].现代情报,2007(10).
Lucene全文检索 第3篇
1 lucene 描述
Lucene是apache软件基金会的一个子项目,它是一个开源的基于JAVA的框架,但并不是一个全文检索引擎,而是可提供查询引擎和索引引擎的全文检索架构,开发人员可在此框架的基础上进行全文检索引擎的开发。
Lucene的组成结构:对于外部应用来说索引模块(index)和检索模块(search)是主要的外部应用入口。该两个模块的真实内核由Lucene7个数据包(接口)组成[10]:搜索入口 (search),索引入口 (index),语言分析器(analysis),查询分析器 (query Parser),存储结构(document),底层I/O存储结构(store),一些公用的数据结构(util)。搜索入口主要完成关键字分词与索引库中存储的词匹配[12,13,14];索引入口是对数据源文件建立一个供检索使用表;语言分析器主要是完成对全文的词的切分;查询分析器完成对查询字段的指定;存储结构有多个field构成,将文件分路径(path字段)、内容(body字段)及其他文件特征形式等多个字段进行存储。
Lucene工作原理如图1所示。Lucene主要完成网页信息采集[7]、资源处理并建立索引、关键字过滤、数据检索和检索结果展示等工作。整个系统流程分为三个阶段:第一阶段网络爬虫从服务器抓取网页信息并下载,同时将下载时间、文件存放路径、网页文件信息等存放到数据库中;第二阶段建立索引阶段,完成需要建立索引网页的分析,将网页名称、网址信息、发布时间信息、站群内路径信息、网页文件进行结构化的存储,放入不同的字段中,形成索引文件;第三阶段检索阶段[6],根据用户提供的关键字在索引文件中进行匹配,检索,根据一定的排序算法返回给用户。
2 系统总体设计
按照Lucene工作原理,站群全文检索系统架构分为两部分:建立索引和检索。建立索引部分包括网页抓取和网页信息处理与索引;检索部分[9]包括数据检索和用户交互界面。系统架构如图2所示。
服务器架构采取分布式架构,三台服务器分别提供用于检索的搜索引擎核心服务器、用于存储的数据库服务器、用于建立WEB页面的Tomcat Web服务器。服务器分布式架构不会因为一台服务器出现故障而影响整个系统,减少故障带来的全局影响。
3 系统详细设计
3.1 网页抓取模块
网页抓取模块主要负责把要抓取的网页信息抓取然后存储在数据库中[8]。该模块主要设计到的技术就是网络爬虫技术[11]。爬虫的主要目的是将互联网上的网页下载到本地形成一个或联网内容的镜像备份。网络爬虫框架设计如图3所示。
网络爬虫的工作流程算法:
步骤1:选取需要抓取页面的URL;
步骤2:将这些URL放入待抓取URL队列;
步骤3:从待抓取URL队列中取出待抓取的URL,解析DNS,并且得到主机的IP,并将URL对应的网页下载下来,存储进已下载网页库中,抓取成功;
步骤4:将已下载过的页面中的URL放入已抓取URL队列;
步骤5:分析已抓取URL队列中的URL,分析没有被下载页面的URL,重复步骤2。
3.2 网页信息处理与索引模块
多线程的通道是Lucene建立索引的必然条件,多线程提高了建立索引的速度。网页文件包括txt、html、shtml、xml等形式,Lucene可以对网页文件建立良好的索引。Lucene建立索引的过程分为四个阶段:获取网页文件数据、设置建立索引规则、建立索引和写入磁盘 / 内存。建立索引所涉及的类以及组成的结构图如图4所示。
3.3 数据检索模块
数据进行检索的过程如图5所示。图5中提到的敏感词是基于自建的敏感词典库的基础上判断的,将政府禁止的一些词汇加入敏感词典库,在进行检索时,将关键字进行分词,在建立的敏感次典库中检索,如果关键字存在敏感词,系统将不检索,直接返回输入关键字页面。
3.4 用户交互界面模块
该模块主要将检索结果按照一定的规则排序返回给用户。该模块设计的核心就是排序算法[16]。返回结果的排序直接影响用户对结果的需求,根据统计,排名前100名的网页将满足80%用户的需求,所以将与关键字最相符的结果展示在返回页面前列。本系统排序算法的规则:
步骤1:判断查询词命中的位置,如果在标题里面,进入步骤2,如果在正文里面,进入步骤4;
步骤2:判断页面发布时间,按发布时间倒序排序;
步骤3:关键词在标题里面排序结束,将结果加入返回结果序列;
步骤4:判断页面发布时间,按发布时间倒序排序;
步骤5:关键词在正文里面排序结束,将结果加入返回结果序列;
步骤6:返回排序结果。
4 系统实现
基于lucene的全文检索搜索引擎[15]实现包括网页抓取、网页信息处理与索引、数据检索和用户交互界面四个模块的实现。本文将以创建索引模块为例进行实现,下面是创建索引模块的一些关键代码和说明[17]。
4.1 首先实例化一个构造器
IndexW riter writer = new Index Writer ("D:/index/",new Pan Gu Analyzer(), true); // 索引的存储位置
这个构造函数包括三个参数:path:索引文件存放的路径。如:String path = "E:\index"; a:分词工具,因为lucene为外国人所开发,所以对中文分词不是很友好,但人类的智慧是无穷的,这里引入盘古分词,专门针对中文的分词。如:a= new Pan Gu Analyzer();create:它是一个boolean型变量,如果为true,表示要重写指定的存放索引目录下的索引文件;如果为false,表示在指定存放索引目录下已经存在的索引文件的基础上,向其中继续追加新的索引文件。
4.2 创建索引
上面创建了一个索引器,建立索引的过程是在一个Index Writer索引器实例存在的前提下,通过为其添加Document,创建索引。
首先创建内部Store类,设置Field的存储属性:
public static final Store COMPRESS = new Store("COMPRESS"); // 在索引中压缩存储Field的值
public static final Store YES = new Store("YES");// 在索引中存储Field的值
public static final Store NO = new Store ("NO"); // 在索引中不存储Field的值
然后通过Index设置索引方式,不对Field进行索引,所以这个Field就不能被检索到,如果对该Field还设置了Field.Store为Field.Store.YES或Field.StoreCOMPRESS,则可以检索。
public static final Index TOKENIZED = new Inde("TOKENIZED"); // 对Field进行索引,同时还要对其进行分词
public static final Index UN_TOKENIZED = new Index("UN_TOKENIZED"); // 对Field进行索引,但不对其进行分词
public static final Index NO_NORMS = new Inde("NO_NORMS"); // 对Field进行索引,但是不使用Analyzer
4.3 优化索引,关闭写入
writer.Optimize(); // 添加完所有document,我们对索引进行优化,优化主要是将多个索引文件合并到一个,有利于提高索引速度
writer.Close();// 随后将writer关闭
4.4 实现界面
该系统实现并运行,图6为将站点加入到全文检索系统中生成索引界面。
5 实验结果与分析
在以上设计的基础上,建立了一个校园网站群检索系统,并以校园网信息为基础进行搜索系统测试。该测试是在实际运行环境下得到的结果。在该环境下对容量为167MB的存储的约6600个文件建立索引,并提供了相应的检索服务,通过关键字,可以查询相关页面。同时在WINDOWS系统下,通过WINDOWS目录搜索对6600个文件进行目录检索测试。两组测试时间和结果数量见表1。测试的结果由表1可知,基于Lucene的全文搜索引擎操作均可在1秒时间内完成,系统能够快速的响应用户的检索请求,而WINDOWS目录搜索时间大部分都大于两秒。由实验结果可知,本文设计的全文检索搜索引擎性能好于WINDOWS目录检索系统。
通过实际测试,本文的搜索引擎检索速度表现优异外,在中文分词、检全率、检准率、检索结果排序等方面均实现了设计的初衷,在速度和效率方面表现良好。
6 结束语
Lucene全文检索 第4篇
Lucene作为世界上最流行的开源全文检索工具包, 已经在许多搜索引擎技术项目中得到了广泛的应用和研究。它提供了灵活的API函数接口和可以定制的数据存储结构, 可以方便地嵌入到各种应用中, 以实现具体的全文检索系统。
目前, 国内对Lucene的研究和应用多数是直接将Lucene应用到全文检索系统[1]中, 由于中文语言与英文语言在体系以及结构上的差别, 将Lucene应用于中文信息处理时, 需要采用适合中文的方法来处理中文信息。Lucene对中文信息的处理仅限于在语言分析器中对汉字的单字切分和双字切分, 这两种方式不能很好地支持Lucene对中文信息的处理。通过分析Lucene语言分析器的结构, 可以构造中文分词模块, 如文献[2]设计实现的基于中文字典的正向最大匹配算法的分词模块, 但是文献并没有给出性能改进的相应数据。
根据不同索引单元对于检索性能的影响分析[3]可以看出, 只加入中文分词模块, 虽然可以改善搜索的效率, 但是搜索结果的精度并没有得到提高。同时索引也存在着许多问题, 在单字切分建立索引时, 在索引中所有的词条的集合就是中文汉字库的一个子集合, 索引中最大的词条个数不会超过21000个。也就是说, 索引中词条的数目可以受到控制。但是由于中文语言中词的数量远远大于汉字的个数, 而且, 随着社会的发展, 新的词语也不断地加入词库, 词库将会越来越大, 因此索引同等数量的文档, 分词索引的词条数量会远远大于字索引中字的个数。中文分词后, 与文档不相关的字和词也同时被索引, 这种方式建立的索引就变成了冗余复杂的词与字的混合索引, 索引中词条的数量不可控制, 降低了搜索的精度。
鉴于当前Lucene中文优化研究中存在的问题, 我们在Lucene 中同时加入中文分词模块和索引文档预处理模块, 来改善搜索的效率以及检索结果的精度, 提高Lucene搜索中文的能力。
1 基于中文Lucene的改进方法
1.1 Lucene改进的总体方案
通过分析Lucene的内部工作原理[4], 将中文分词模块和索引文档预处理模块加入到Lucene中, 图1给出了优化后的结构图。
1.2 中文分词模块对搜索效率的改进
在Lucene中, 关键词的检索可以分为两大部分:关键词与文档的相似度计算, 检索返回结果文档的排序得分计算。
Lucene的检索方法是基于向量空间模型[5]的。查询词和文档都被表示成为向量。文档和查询词之间的相似度通过向量夹角的余弦值表示[4,5]:
其中, wq, t=log (N/ft) +1, wd, t=log (fd, t+1) , fd, t是词条t在文档d中出现的频率, N是文档的总数, ft是包含词条t的文档数目。
Lucene内部有一套计算得分的方法, 具体公式如下[4]:
其中, f (t in d) 表示词条频率, idf (t) 表示反转词频, Boost (t.field in d) 表示在建立索引时对文档设置的一种激励因子, lengthNorm (t.field in d) 表示对文档设置的一个长度因子。
一个由n个字组成的查询串q通过分词, 被切分成了m个词条, 都有mn。通过分析公式 (1) 和公式 (2) , 在分别针对单字索引和分词索引搜索时, 由于词条的个数小于字数, 对于文档相关度和排序得分计算的时间相对单字索引减少, 因此分词索引比字索引有更高的效率。
1.3 索引文档预处理模块
添加索引预处理模块的目的是为了提高检索结果的精度。索引预处理的算法描述如下:
(1) 对文档分词后, 标注词性 (中科院分词API具有标注词性的功能) ;
(2) 提取文档中名词、动词和形容词;
(3) 对选取的词统计词频;如果索引的文档大于10篇跳转到 (5) , 索引文档小于10篇进行下一步;
(4) 选取词频排名前50-100的词作为文档的特征词, 根据对系统精度的要求来具体确定选取的词的个数;
(5) 计算每个词的TF*IDF值[5], 并根据TF*IDF值对这些词进行降序排列, 选取排名前50-100个词作为文档的特征词;
(6) 将选取的特征词以及它的词频构建字符串代替文档建立索引。
对文档预处理后, 文档由一个特征词向量来表示, 过滤掉了文档中无关文档意义的字和词, 大批量文档建立索引时, 可以有效地控制索引中词条的数量, 优化了索引, 达到了提高搜索精度的目的。根据以往的实验, 对于普通的网页文档, 50-100个特征词可以有效地表示一篇文档的特征, 在保证精度的基础上, 可以通过增加特征词的数量以及选择更多的词性来提高相应的结果召回率。
2 实验与数据分析
2.1 实验的设计
选取搜狗实验室分类语料[6]中10000篇文章作为实验语料。采用三种不同的方法建立索引:
A1: 采用Lucene内部的单字切分标准分析器来建立索引;
A2: 只添加中文分词模块来建立索引;
A3: 添加中文分词模块和索引文档预处理模块建立索引, 采用50-100个特征词来替代文档。
为了便于结果的再处理, 三种索引均采用保存文档正文的方式。中文分词模块由中科院分词API来构造。关闭网络和多余进程以减少操作系统对搜索的影响。选取10个不同主题的关键词分别对三种索引进行搜索。由于75%的汉语常用词是由两个汉字组成的[7], 我们采用双字的关键词, 并且保证A2和A3的词条中存在这些关键词。对10个关键词采用依次测试, 每个关键词记录在A1, A2, A3中搜索的结果数量。
2.2 实验数据分析
在图2中, A4表示对于给定的关键词{ K1, K2, K3, , K10}基于文章主题人为划定的文档集合{D1, D2, D3, , D10}分别包含的文档数目, 我们用A4作为测定三类索引检索精度的标准, 从图中可以看出A3的曲线与A4相吻合, 由于在A1中, 索引包含的词条为单个汉字, 因此很多不相关的内容也会被搜索出来。 A2由于索引中冗余词条以及单个汉字的干扰, 它的精度不够理想。比如, 在搜索“人民”这个关键词时, 如果一篇文章中, 含有“人”和“民”这两个汉字而不含有 “人民”, 也会被认为是相关文档而被检索, 这种情况对于A1和A2来说, 是经常存在的。A3 有效地避免了这种情况的发生, 它只会把含有“人民”这个关键词的文档检索出来。同时, 由于索引文档预处理模块对文档的预处理, 如果文档中仅含有“人民”而关键词与文档的主题没有关系, 也不会被检索出来。因此, A3有效地提高了系统的检索精度。
在图3中A4代表对于给定的关键词{ K1, K2, K3, , K10}, 基于文章主题人为划定的文档集合{D1, D2, D3, , D10}。M50, M75, M100分别代表利用50, 75, 100个特征词替代文档建立索引后, 检索不同关键词的搜索结果集合。从图3中可以看出, 三条曲线都基本与A4吻合, 这说明采用50-100个特征词替代文档索引时, 检索关键词{ K1, K2, K3, , K10}时的返回结果集合与基于文章主题人为划定的文档集合{D1, D2, D3, , D10}是基本相同的, 由此可以得出在索引文档预处理模块中采用50-100个特征词替代一篇文档来建立索引的方法能很好地解决精度问题。
3 总 结
Lucene中加入中文分词模块和索引文档预处理模块的方法简单易行, 两个模块的可移植性强, 便于添加和改进。通过分析实验的数据, 可以看出添加模块后, 不但提高了检索的效率, 而且对索引文档预处理后, 明显提高了检索结果的精度, 方便了用户的查找。在以后的研究中, 在中文分词模块中加入未登录词识别模块, 以及改进特征词向量的构造方法, 可以进一步提高Lucene搜索中文的精度。
摘要:为了提高基于Lucene中文检索系统的检索精度和效率, 通过分析Lucene的结构, 在系统中加入了中文分词模块和索引文档预处理模块。给出了具体的实验方法和实验过程, 对改进原理和实验数据进行了分析, 表明了加入中文分词模块和在索引预处理模块中采用提取特定数量的特征词来替代文档的方法能够有效提高Lucene检索系统的效率和精度, 增强Lucene检索系统中文的性能。
关键词:Lucene,索引,中文分词,文档预处理
参考文献
[1]郎小伟, 王申康.基于Lucene的全文检索研究与开发[J].计算机工程, 2006.32 (4) :94-96.
[2]向晖, 郭一平, 王亮.基于Lucene的中文字典分词模块的设计与实现[J].现代图书情报技术, 2006, 8.
[3]Yuejie Zhang, Tao Zhang, Shijie Chen.Research on Lucene-based Eng-lish-Chinese Cross-Language Information Retrieval.Journal of ChineseLanguage and Computing, 2005, 15 (1) :25-32.
[4]Apache Lucene[CP].http://lucene.apache.org/java/docs/.
[5]Salton G, learnin A.Approach to Personalized information Filtering[D].Massachusetts Inst of Technology, 1994.
[6]http://www.sogou.com/labs/dl/c.html (2007) .
Lucene全文检索 第5篇
关键词:全文搜索,中文分词,搜索引擎,Lucene
基于关键字的文本搜索是信息系统最重要最常用的功能之一,而开放源代码的Lucene全文检索技术是信息检索领域广泛使用的基本技术,被大量的集成到各种系统软件以及构建Web应用系统中去,作为软件的全文检索子系统的核心。基于关键字的文本搜索首先要解决分词问题,虽然Lucene内置了分词器功能,但无法支持复杂的中文分词。因此,本文在比较各类中文分词器的基础上,采用PaodingAnalyzer分词器代替Lucene内置分词器,与Lucene共同构建起一个中文环境下高效、准确的全文搜索引擎系统。
1 关键技术
1.1 Lucene
Lucene是apache软件基金会jakarta项目组下的一个子项目,是一个开放源代码的全文检索引擎工具包[1]。作为一个开放源代码项目,Lucene发布后,引发了开放源代码社区的热烈反应,开发者不仅使用它构建具体的全文检索应用,而且将Lucene整合到各种系统软件以及各种Web应用中,甚至也有商业软件也采用Lucene作为其全文检索子系统的核心。
采用Lucene构建全文搜索引擎不仅在于其开源、免费,而且在于高性能、纯JAVA跨平台应用,方便移植可重用;Lucene作为一个全文检索引擎,其突出的技术应用优势是不仅在传统全文检索引擎的倒排索引的基础上,实现了分块索引,而且设计了独立于语言和文件格式的文本分析接口;还实现了一套强大的查询引擎,用户无需自己编写代码即可使系统可获得强大的查询能力。
1.2 PaodingAnalyzer中文分词器
当前基于Lucene的中文分词器主要有PaodingAnalyzer、imdict、mmseg4j、ik等四种。从是否支持用户自定义词库、运行速度、算法与代码复杂度、开发者与开发社区活跃度等方面综合分析权衡,本系统最终采用PaodingAnalyzer分词器来实现中文分词功能。
PaodingAnalyzer中文分词器,又称庖丁解牛中文切词器[2]。PaodingAnalyzer基于Java的开源中文分词组件,提供lucen和solr接口,具有极高效率和高扩展性。它采用基于不限制个数的词典文件对文章进行有效切分,支持最大/最小切词。字典灵活且文件个数不限、名称不限、只要符合以dic作为扩展名的文件均视为字典。可以根据需要加减字典目录以及目录下的字典。
2 系统设计与实现
在本搜索引擎系统中,采用基于Lucene全文检索引擎开源项目为系统开发核心,并整合PaodingAnalyzer中文分词器以解决Lucene中不支持中文分词问题,系统由三大模块组成:文件索引模块、搜索查询模块与搜索结果排序与显示模块。
系统的工作流程是,首先对通过爬虫等方法收集起来的所有文档建立索引;其次是设计开发查询分析器对用户查询请求进行分词与匹配查找;最后把查找结果通过排序算法与关键字高亮显示等方式反馈到查询客户端。各模块工作原理与相互协作流程系统整体框架图如图1所示:
2.1 文件索引
系统中待索引文件可用网络爬虫,手工等方式收集,文件格式可以为html、doc、ppt、xls、pdf、txt等文档。在建立文件索引前首先必须通过文件格式转换器对特定的文件格式采用相对应的解释类对文档进行格式转换与清洗,如PDF格式文件通过PDFBox类解释,Word和Excel通过POI类解析,并最终将文档内容转换成字节流。建立索引之前必须进行中文分词,Pa odingAnalyzer中文分词器对通过格式转换器生成的字节流进行中文分词处理。最后通过索引创建器中Lucene索引类中In dexWriter方法对所有文档建立索引并对索引进行存储,在索引结束时使用Lucene的wirter.optimize()方法优化索引。索引创建过程如图1中的系统工作流程图所示。
2.2 搜索查询
在客户端输入查询关键字后,首先使用中文分词器接收传递过来的查询数据,进行合理的中文分词处理,再使用分割的最后将结果反馈回客户端。
Lucene中IndexSeacher类是搜索操作的入口,所有搜索操作都是通过IndexSeacher实例使用一个重载的search方法来实现。具体的Query子类为每一种特定类型的查询进行逻辑上的封装。Query实例被传递到IndexSearcher的search方法中。QueryParser将用户输入的查询表达式处理为一个具体的Query对象。
2.3 搜索结果处理
通过关键字搜索,获取文档的URL,并利用文件系统解析到结果界面。Lucene的默认搜索结果排序是按照文档的得分进行排序的。当检索结果集中有两个文档具有相同的得分时,默认按照文档的ID对结果进行排序。还可以使用Sort排序工具实现个性化排序,方法如下:Lucene在查询的时候,可以通过以一个Sort作为参数构造一个检索器IndexSearcher,在构造Sort的时候,指定排序规则。
Lucene搜索结果分页,与读取数据库表的分页类似,每次仅取出前10条记录,这样避免了内存溢出的可能,但是每次搜索都要进行一次IO操作,如果大并发访问的情况下,对服务器硬盘的转速与处理器的频率性能要求较高。
在搜索结果页面中,还使用关键字加粗高亮显示。在org apache.Lucene.search.highlight包中提供了关于高亮显示检索关键字的工具。
3 系统测试
选择html、doc、pdf、txt四种类型文档各10份,每份文档文本包含“计算机科学技术”相关内容,首先对文档进行中文分词,然后对其建立中文索引,最后使用关键字搜索。测试的结果如下:
PaodingAnalyzer中文分词器对“计算机科学技术”分词后的结果是:计算计算机计算科学科学技术科学技术计算科学计算技术。中文分词器基本符合分词要求。在客户端输入以上相关的关键字搜索,都能成功搜索出有相关内容的测试文档机及内容。
4 结束语
基于Lucene的中文分词全文搜索引擎系统经过测试,性能较为稳健,准确率也较高,基本满足中文环境下的搜索需求,但文件的索引速度与构建实时索引方面还有较大的完善空间,其次,搜索查询速度较为缓慢,主要原因是每次运行,都会进行索引的加载,影响了性能,后期将对其进行缓存,可大幅度提升搜索的速度。
参考文献
[1]管建,甘剑峰.基于Lucene全文检索引擎的应用研究与实现[J].计算机工程与设计,2007(2).
Lucene全文检索 第6篇
1 非结构化电子病历的检索缺陷
非结构化电子病历不具备全文检索功能。其主要功能始终停留在纸质病历电子化程度上, 仅具有记录、存储和调阅功能。对这样的病历系统, 统计检索工作主要围绕病案首页展开, 即把患者的基本信息, 如入院诊断、出院诊断、治疗结果等主要医疗信息填写在数据库中, 利用数据库的统计和检索功能进行相应的开发。当需要查询的信息如果不在病案首页涵盖的范围内, 则必须由人工打开病历逐一查找统计。为使非结构化电子病历能方便地在“军卫一号”系统中实现全文检索功能, 我们开发了基于Lucene搜索引擎的非结构化电子病历检索系统。
2 Lucene搜索引擎概述
搜索引擎从诞生到现在不到20年时间, 经过了一个短暂的雏形阶段, 就发展成熟了两代产品。包括以人工目录搜索为特点的第一代搜索引擎和以超链分析为基础、机器自动处理的第二代搜索引擎。搜索引擎按照工作方式主要分为3类:基于爬虫的自动搜索引擎、目录索引搜索引擎和元搜索引擎。基于爬虫的自动搜索引擎是目前真正意义上的搜索引擎, 也是搜索引擎的主流[1,2]。目前, 使用最多的Google、百度是其典型代表。不同的搜索引擎收录的数据范围不同, 有的覆盖全网信息、有的针对某一个领域专门处理。从搜索引擎信息覆盖的领域和范围来看, 可以分为通用搜索引擎和垂直搜索引擎两类。互联网上的信息除了文字信息还有各种媒体内容, 针对不同类型的信息, 需要使用不同的搜索技术实现, 如文字搜索引擎、音乐搜索引擎、视频搜索引擎和图像搜索引擎等[3]。
搜索引擎技术是互联网资源导航和访问的重要手段, 但是对于一般开发者而言, 搜索引擎的底层开发技术过于复杂, 加上各大搜索引擎厂商对核心技术严格保密, 使搜索引擎开发有很高的门槛。搜索引擎在普通应用系统中的普及, 开源项目的推动作用功不可没。进行全文检索系统研发或者搜索引擎研发的开发者都用过或借鉴过开源搜索引擎的代码或设计思路开源搜索引擎项目。主要的开源搜索引擎系统有Lucene全文检索系统、Nutch系统、Compass和Labin系统。其中Lucene是一套全文检索工具包, 是一个开源代码系统, 是Apache软件基金会的一个子项目, 提供了一个全文检索引擎的构架, 完整的查询引擎和索引引擎[4,5]。Lucene本身并不是一个完整的全文检索引擎, 但他的设计目的是为软件开发人员提供一个开发工具包, 以方便普通开发者在系统中实现全文检索的功能。利用Lucene经过简单设置就可以建立自己内部网的搜索引擎, 也可以针对互联网建立搜索引擎, 还可以与数据库结合建立索引。经过多年的发展, Lucene在全文检索领域已经有了很多的成功案例, 几乎适合于任何需要全文检索的应用, 尤其是跨平台的应用。另外, Lucene不但是一个高性能的全文检索引擎, 而且免费、开源。
3 病历全文搜索引擎系统的设计与实现
3.1 总体构架 (图1)
3.1.1 搭建搜索引擎的网站平台
Web服务器是在网络中为实现信息发布、资料查询、数据处理等诸多应用搭建的基本平台;Tomcat Server严格执行Servlet和JSP规范, 是一个十分有用的网络应用开发服务平台。本项目是在Windows2003 Server系统中按照配置的Tomcat Server作为搜索引擎与用户进行交互的。
3.1.2 索引模块
本项目的文本索引只有Word结构的电子病历, 文本种类比较单一, 所以在使用时仅调用Lucene的Word文本分析API即可。
3.1.3 检索模块
检索模块的主要功能是根据用户输入的关键词在索引器形成的倒排表中进行检索, 同时完成页面与检索之间的相关度评价, 对将要输出的结果进行排序, 并实现某种用户相关性反馈机制。
3.2 实现与应用
利用Lucene的内在模块, 能够简单快速地搭建起全文搜索平台, 只需在程序中指定病历文件的存储位置并进行简单的编程即可, 此处不再赘述。
建立非结构化电子病历“搜索平台”后, 本院研究人员对非结构化电子病历进行了检索测试。从1万余名住院患者中搜寻口腔癌患者, 并找到每个人不在病案首页中记录的属性, 如吸烟、分期、城乡等。在使用搜索平台之前, 类似此项的工作, 如果1个人需要整理将近2个月的时间才能完成, 而且出错的比例很大, 还要花费大量时间反复查找和修正。在使用搜索平台工作后, 此项工作变得非常轻松, 搜索一个关键词后, 还能在结果中继续搜索, 从检索出的关键词前后语义就能基本判断该记录是否有效, 从而层层筛选, 轻松完成纳入和排出工作, 极大地提高了临床研究的工作效率。
4 讨论
4.1 分词问题
Lucene中可以调用各种成熟的分词算法和软件包, 用于解决索引建立过程的分词问题。由于中文文档十分复杂, 计算机处理有很大的难度, 虽然很多专家做了大量的工作, 目前仍没用完全解决中文分词的问题。最突出的有两个问题:
(1) 切分歧义识别。中文的切分歧义是指中文的一句话按照指定的算法可能有两种或多种切分方法。这种情况如果没有上下文和语境背景, 即便是人工也无法判断如何切分[6,7,8]。在本项目使用的分词器中, 就发现有类似的情况出现, 如分别用“异常”、“异常肿大”在病历文档中搜索, 结果见图2~3。图2显示, 搜索引擎把所有含有“异常”的文档全部显示出来, 包括“未见异常”、“无异常”等。但是在图3用“异常分泌”检索中却没有搜索到任何文件。从显示的红色字体看出搜索引擎所用的分词器没有把“异常分泌”作为一个分词, 所以没有对该词建立索引。
(2) 未收录词识别。新词的出现, 在短时间内无法收录到字典中, 如经常遇到的是人名、特定的产品型号、特定事物名称等。特别在医学领域中, 新的诊断方式、新药品等新技术手段层出不穷, 这个问题会更加突出。
上述问题主要由中文分词器引起, 目前本项目使用的是自动分词技术, 基于自动切分的最大优点是没有词表维护成本、实现简单;缺点是索引效率低, 但对于中小型应用来说, 基于2元语法的切分还是够用的。目前比较大的搜索引擎的语言分析算法一般是基于以上两个机制的结合[9]。
解决该问题的方法是在自动分词的基础上加入词库分词, 这样就能逐渐积累常用医学词汇, 满足实际需要。
4.2“虚拟机”技术
Lucene基于JAVA技术开发, 构架该搜索引擎需要搭建包括Web服务器在内的一整套系统。虽然技术并不复杂, 但是仍旧增加了推广应用的复杂程度。本系统利用了“虚拟机”技术, 不但节省了使用单位的硬件资源, 而且能够以一个“虚拟机”系统包的形式进行分发。这样用户同样可以利用虚拟机技术对该系统包进行还原, 直接还原整套系统, 仅需根据实际网络环境修改虚拟服务器IP地址即可。
综上所述, 该系统利用已有的成熟技术解决了各医院长年积累的非结构化电子病历无法检索的问题[10]。该系统的建立, 最大的意义在于为非结构化电子病历的检索难题提供了一个新思路。利用Lucene技术开发目前的检索系统并不复杂, 但是, 如果要完全满足临床及科研的全部要求, 该系统还略显稚嫩, 还需要利用JAVA技术开发包括统计、报表等一系列功能。所以, 该系统还有很大的发展空间。
参考文献
[1]车东.在应用中加入全文检索功能-基于Java的全文索引引擎Lucene简介[EB/OL]. (2006-03-10) [2012-04-27].http://www.chedong.com/tech/lucene.html.
[2]李玮, 李利.Web搜索引擎与全文检索技术[J].情报科学, 2003, 24 (5) :265-268.
[3]Owens SJ.Lucene tutorial[EB/OL]. (2000-09) [2012-04-27].Http://www.lucenetutorial.com.
[4]Goetz B.The Lucene search engine:powerful, flexible andfree[EB/OL]. (2000-09-15) [2012-04-27].Http://www.javaworld.com/jw-09-2000/jw-0915-lucene.html.
[5]高琰, 古士文, 谭立球等.基于Lucene的搜索引擎设计与实现[J].微机发展, 2004, 14 (10) :27-30.
[6]孙西全, 马瑞芳, 李燕灵.基于Lucene的信息检索的研究与应用[J].情报理论与实践, 2006, 29 (1) :125-128.
[7]王学松.Lucene+nutch搜索引擎开发[M].河北:人民邮电出版社, 2008:185-186.
[8]夏立新, 王忠义.基于XML的全文检索原型系统的设计与实现[J].现代图书情报技术, 2007, (8) :67-70.
[9]申兵一, 巩青歌.基于Lucene的PDF文档文本解析的实现[J].信息与电脑, 2009, (11) :66.