query=newFuzzyQuery(newTerm("title",searchWords[i]));
Hitsresults=indexSearcher.search(query);
System.out.println(results.length()+"searchresultsforquery"+searchWords[i]);
}
}
范围搜索(RangeSearch)
范围搜索匹配某个域上的值在一定范围的文档。
例如,查询“age:
[18TO35]”返回所有age域上的值在18到35之间的文档。
清单5显示了利用Lucene的API进行返回搜索的过程。
清单5:
测试范围搜索
//Testrangesearch
publicvoidtestRangeSearch(StringindexDirectory)throwsException{
Directorydir=FSDirectory.getDirectory(indexDirectory,false);
IndexSearcherindexSearcher=newIndexSearcher(dir);
Termbegin=newTerm("birthDay","20000101");
Termend=newTerm("birthDay","20060606");
Queryquery=newRangeQuery(begin,end,true);
Hitsresults=indexSearcher.search(query);
System.out.println(results.length()+"searchresultsisreturned");
}
回页首
在Web应用程序中集成Lucene
接下来我们开发一个Web应用程序利用Lucene来检索存放在文件服务器上的HTML文档。
在开始之前,需要准备如下环境:
1.Eclipse集成开发环境
2.Tomcat5.0
3.LuceneLibrary
4.JDK1.5
这个例子使用Eclipse进行Web应用程序的开发,最终这个Web应用程序跑在Tomcat5.0上面。
在准备好开发所必需的环境之后,我们接下来进行Web应用程序的开发。
1、创建一个动态Web项目
1.在Eclipse里面,选择File>New>Project,然后再弹出的窗口中选择动态Web项目,如图二所示。
图二:
创建动态Web项目
2.在创建好动态Web项目之后,你会看到创建好的项目的结构,如图三所示,项目的名称为sample.dw.paper.lucene。
图三:
动态Web项目的结构
2.设计Web项目的架构
在我们的设计中,把该系统分成如下四个子系统:
1.用户接口:
这个子系统提供用户界面使用户可以向Web应用程序服务器提交搜索请求,然后搜索结果通过用户接口来显示出来。
我们用一个名为search.jsp的页面来实现该子系统。
2.请求管理器:
这个子系统管理从客户端发送过来的搜索请求并把搜索请求分发到搜索子系统中。
最后搜索结果从搜索子系统返回并最终发送到用户接口子系统。
我们使用一个Servlet来实现这个子系统。
3.搜索子系统:
这个子系统负责在索引文件上进行搜索并把搜索结构传递给请求管理器。
我们使用Lucene提供的API来实现该子系统。
4.索引子系统:
这个子系统用来为HTML页面来创建索引。
我们使用Lucene的API以及Lucene提供的一个HTML解析器来创建该子系统。
图4显示了我们设计的详细信息,我们将用户接口子系统放到webContent目录下面。
你会看到一个名为search.jsp的页面在这个文件夹里面。
请求管理子系统在包sample.dw.paper.lucene.servlet下面,类SearchController负责功能的实现。
搜索子系统放在包sample.dw.paper.lucene.search当中,它包含了两个类,SearchManager和SearchResultBean,第一个类用来实现搜索功能,第二个类用来描述搜索结果的结构。
索引子系统放在包sample.dw.paper.lucene.index当中。
类IndexManager负责为HTML文件创建索引。
该子系统利用包sample.dw.paper.lucene.util里面的类HTMLDocParser提供的方法getTitle和getContent来对HTML页面进行解析。
图四:
项目的架构设计
3.子系统的实现
在分析了系统的架构设计之后,我们接下来看系统实现的详细信息。
1.用户接口:
这个子系统有一个名为search.jsp的JSP文件来实现,这个JSP页面包含两个部分。
第一部分提供了一个用户接口去向Web应用程序服务器提交搜索请求,如图5所示。
注意到这里的搜索请求发送到了一个名为SearchController的Servlet上面。
Servlet的名字和具体实现的类的对应关系在web.xml里面指定。
图5:
向Web服务器提交搜索请求
这个JSP的第二部分负责显示搜索结果给用户,如图6所示:
图6:
显示搜索结果
2.请求管理器:
一个名为SearchController的servlet用来实现该子系统。
清单6给出了这个类的源代码。
清单6:
请求管理器的实现
packagesample.dw.paper.lucene.servlet;
importjava.io.IOException;
importjava.util.List;
importjavax.servlet.RequestDispatcher;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importsample.dw.paper.lucene.search.SearchManager;
/**
*Thisservletisusedtodealwiththesearchrequest
*andreturnthesearchresultstotheclient
*/
publicclassSearchControllerextendsHttpServlet{
privatestaticfinallongserialVersionUID=1L;
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsIOException,ServletException{
StringsearchWord=request.getParameter("searchWord");
SearchManagersearchManager=newSearchManager(searchWord);
ListsearchResult=null;
searchResult=searchManager.search();
RequestDispatcherdispatcher=request.getRequestDispatcher("search.jsp");
request.setAttribute("searchResult",searchResult);
dispatcher.forward(request,response);
}
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsIOException,ServletException{
doPost(request,response);
}
}
在清单6中,doPost方法从客户端获取搜索词并创建类SearchManager的一个实例,其中类SearchManager在搜索子系统中进行了定义。
然后,SearchManager的方法search会被调用。
最后搜索结果被返回到客户端。
3.搜索子系统:
在这个子系统中,我们定义了两个类:
SearchManager和SearchResultBean。
第一个类用来实现搜索功能,第二个类是个JavaBean,用来描述搜索结果的结构。
清单7给出了类SearchManager的源代码。
清单7:
搜索功能的实现
packagesample.dw.paper.lucene.search;
importjava.io.IOException;
importjava.util.ArrayList;
importjava.util.List;
importorg.apache.lucene.analysis.Analyzer;
importorg.apache.lucene.analysis.standard.StandardAnalyzer;
importorg.apache.lucene.queryParser.ParseException;
importorg.apache.lucene.queryParser.QueryParser;
importorg.apache.lucene.search.Hits;
importorg.apache.lucene.search.IndexSearcher;
importorg.apache.lucene.search.Query;
importsample.dw.paper.lucene.index.IndexManager;
/**
*Thisclassisusedtosearchthe
*Luceneindexandreturnsearchresults
*/
publicclassSearchManager{
privateStringsearchWord;
privateIndexManagerindexManager;
privateAnalyzeranalyzer;
publicSearchManager(StringsearchWord){
this.searchWord=searchWord;
this.indexManager=newIndexManager();
this.analyzer=newStandardAnalyzer();
}
/**
*dosearch
*/
publicListsearch(){
ListsearchResult=newArrayList();
if(false==indexManager.ifIndexExist()){
try{
if(false==indexManager.createIndex()){
returnsearchResult;
}
}catch(IOExceptione){
e.printStackTrace();
returnsearchResult;
}
}
IndexSearcherindexSearcher=null;
try{
indexSearcher=newIndexSearcher(indexManager.getIndexDir());
}catch(IOExceptionioe){
ioe.printStackTrace();
}
QueryParserqueryParser=newQueryParser("content",analyzer);
Queryquery=null;
try{
query=queryParser.parse(searchWord);
}catch(ParseExceptione){
e.printStackTrace();
}
if(null!
=query>>null!
=indexSearcher){
try{
Hitshits=indexSearcher.search(query);
for(inti=0;iSearchResultBeanresultBean=newSearchResultBean();
resultBean.setHtmlPath(hits.doc(i).get("path"));
resultBean.setHtmlTitle(hits.doc(i).get("title"));
searchResult.add(resultBean);
}
}catch(IOExceptione