用JSP调用Lucene包来实现全文检索
2007-07-05陆云
陆 云
摘要:介绍了实现全文检索的三个组件(Tomcat、JSP、Lucene)对应全文检索系统结构.给出了具体实现的运作流程和主要部分的核心代码及相应说明。
关键词:Tomcat+JSP+Lucene运作流程核心代码说明
中图分类号TP311.56
文献标识码B文章编号:1002-2422(2007)03-0029-02
1Tomcat+JSP+Lvcene
1.1Tomcat的Web服务器
Web服务器是在网络中为实现信息发布、资料查询、数据处理等诸多应用搭建基本平台的服务器。Tomcat Server是根据Servlet和JSP规范进行执行的,是一个十分有用的网络应用开发服务平台。它的下载、安装、使用见网站:http://Aomcat.apache.org/
1.2JSP(Java Server Pages)
JSP(Java Server Pages)是由Sun Microsystems公司倡导、许多公司参与一起建立的一种动态网页技术标准。JSP技术是用JAVA语言作为脚本语言的,JSP网页为整个服务器端的JAVA库单元提供了一个接口来服务于HTTP的应用程序。
在传统的网页HTML文件(*.htm,*.html)中加入Java程序片段(Scriptlet)和JSP标记(tag),就构成了JSP网页(*.jsp)。Web服务器在遇到访问JSP网页的请求时,首先执行其中的程序片段,然后将执行结果以HTML格式返回给客户。
1.3Lucene
Lucene是Apache的开源项目,是用Java写的全文索引引擎工具包。它提供了许多简单实用的API,用这些API,就可以方便的嵌入到各种应用中,对任何基于文本的数据进行全文检索。
Lucene是用Java写的,它的运行、调试都需要有JavaSDK。Lucene的下载、安装、使用见网站:http://Aucene.apache.org/
2全文检索的实现
2.1全文检索系统的结构
全文检索系统是按照全文检索理论建立起来的用于提供全文检索服务的软件系统。一般来说,全文检索需要具备建立索引和提供查询的基本功能,此外现代的全文检索系统还需要具有方便的用户接口、面向www的开发接口、二次应用开发接口等等。结构上,全文检索系统核心具有索引引擎、查询引擎、文本分析引擎、对外接口等等,加上各种外围应用系统等共同构成了全文检索系统。当然,全文检索系统中最为关键的部分是全文检索引擎,各种应用程序都需要建立在这个引擎之上。
(1)核心部分+检索引擎:在java平台上,便用Lucene的API编辑、调试好全文检索程序*.java;
(2)开发接口:编辑*.html文件,加入调试好的全文检索程序*.java和相应的JSP标记(tag);
(3)Web应用程序:Tomcat提供网络应用开发服务平台,在它的基础上执行*.jsp,最后的程序以*.jsp的形式出现,执行时先启动Tomcat,设定好端口,在地址栏输入相应的*.jsp。
2.2全文检索实现主要部分的核心代码和相应分析
一个全文检索系统的核心部分是建立索引,形成索引文件,然后依据客户输入的索引关键字(词),再查找索引文件,形成对应,最后按客户的要求返回检索结果,好的检索程序应提供良好界面便于客户查看检索结果。
下面附具体实现对应各主要部分的核心代码和相应分析。
2.2.1建立索引
程序中所用类别:
page import=“java.io.*,org.apache.lucene.analysis.*,org.apache.lucene.document.*,org.apache.lucene.index.*,org.apache.lucene.searchh.*,org.apache.lucene.queryPamer.*,org.apoche.lucene.analysis.cn.ChineseAnalyzer,org.apache.lucene.store.Directery,org.apache.lucene.store.FSDirectory
(1)建索引的子程序
public void indexDocs(IndexWriter writer,File fileFile)throwsIOException{
∥do not try to index files that cannot be read
if(fihFile.canRead())
}
if(fileFile.isDirectory()){
String[] files=fileFile.fist();
∥an IO error could occur
if(files!=null)}
for(int i=O;i<files.length;i++){
递归调用,用于对于文件夹中文件的添加
indexDocs(writer,new File(Filefile,fries[i]));}
//Document表示一条被索引的记录,对应本程序即为一个文件,doc.add()语句应用不同的模式加入文件的不同对象(文件名、所在文件夹、文件内容)
Document doc=new Document();
String fdeName=fdeFile.getName();
String dirName=fileFile.getPath()。subetring(15);
doc.add(new Field(“flleName”,fdeName,Field.Store.YES.Field.
Index.UN_TOKENIZED));
doe.add(new Field(“directoz7”,dirName,Field.Store.YES,Field.
Index.UN_TOKENIZED):
doc.add(new Field(“content”,new lnputStreamReader(new Fileln-putStream(fdeFile),“gb2312”)));
//IndexWriter专门用于索引文件的写入操作;根据开始部分定义IndexWfiter writer,writer为IndexWriter对象writer.addDocumem(doc);
(2)索引建立的主体部分(含对以上子程序的调用)
//StandandAnalyzer是一个标准分析器,用于对要索引的内容进行切分处理,应用对象为英文,全文检索程序需要对网站内大量数据进行检索,应用对象为中文.ChineseAnalyzer为中文分析器.
Analyzer analyzer=new ChineseAnalyzer();
IndexWriter iwriter=new IndexWriter(“webapps/search/testindex”,analyzer,true);
iwriter.setMaxFieldLength(25000);
//对子程序的调用
indexDocs(iwriter,new File(“webapps/search/files”));