Lucene3.6实现全文检索的小例子
引入jar包::
lucene-analyzers-3.6.1.jar
lucene-core-3.6.1.jar
lucene-highlighter-3.6.1.jar(高亮效果)
首先,将需要检索的数据用内定的方式创建索引,(这里创建索引保存在硬盘)
1、新建一个config.properties
#路径
indexPath=C:/lucene-doc
2、建一个Configuration类:
importjava.io.IOException;
importjava.io.InputStream;
importjava.util.Properties;
publicclassConfiguration{
//采用单例模式
privatestaticfinalConfigurationconfiguration=newConfiguration();
privateConfiguration(){}
publicsynchronizedstaticConfigurationgetInstance(){
returnconfiguration;
}
publicStringread(Stringproperties,Stringkey){
//读取配置文件
InputStreamin=this.getClass().getClassLoader().getResourceAsStream(properties);
Propertiesp=newProperties();
try{
p.load(in);
}catch(IOExceptione){
e.printStackTrace();
}
//取得配置文件中的值
returnp.getProperty(key);
}
}
3、创建索引:
/**
*创建索引
*/
publicStringcreateSearch()throwsException{
System.out.println("开始创建索引。。。");
longstime=newDate().getTime();
StringindexPath=Configuration.getInstance().read("config.properties","indexPath");
Directorydir=FSDirectory.open(newFile(indexPath));
Analyzeranalyzer=newStandardAnalyzer(Version.LUCENE_36);
IndexWriterConfigiwc=newIndexWriterConfig(Version.LUCENE_36,analyzer);
iwc.setOpenMode(OpenMode.CREATE);//即创建新索引文件OpenMode.CREATE_OR_APPEND表示创建或追加到已有索引文件
IndexWriterwriter=newIndexWriter(dir,iwc);
//需要建立索引的数据
List<User>users=userService.getAll();//从数据库获取数据
for(Useru:users){
Documentdoc=newDocument();
//int要转换String
doc.add(newField("id",String.valueOf(u.getId()),Field.Store.YES,Field.Index.ANALYZED));
doc.add(newField("username",u.getUsername(),Field.Store.YES,Field.Index.ANALYZED));
writer.addDocument(doc);
}
writer.close();
longendTime=newDate().getTime();
System.out.println("这花费了"+(endTime-stime)+"毫秒来把数据增加到索引"+indexPath+"里面去!");
returnSUCCESS;
}
结果如下:
开始创建索引。。。
这花费了1285毫秒来把数据增加到索引C:/lucene-doc里面去!
4、根据关键字,检索:
/**
*从Lucene索引库中——搜索
*/
publicStringsearchKeyword()throwsException{
System.out.println("开始检索。。。");
longstartTime=newDate().getTime();
StringindexPath=Configuration.getInstance().read("config.properties","indexPath");
users=newArrayList<User>();
IndexReaderreader=IndexReader.open(FSDirectory.open(newFile(indexPath)));
IndexSearchersearcher=newIndexSearcher(reader);
Analyzeranalyzer=newStandardAnalyzer(Version.LUCENE_36);
Stringfield="username";//设置一个默认的field,因为在用户没有指定field时,lucene会在默认的field中检索
QueryParserparser=newQueryParser(Version.LUCENE_36,field,analyzer);
Queryquery=parser.parse(keyword);//搜索关键词
searcher.search(query,null,100);
TopDocsresults=searcher.search(query,10);//只取排名前10的搜索结果
ScoreDoc[]hits=results.scoreDocs;
Documentdoc=null;
for(ScoreDocscorceDoc:hits){
doc=searcher.doc(scorceDoc.doc);
Useru=newUser();
u.setId(Integer.parseInt(doc.get("id")));
//u.setUsername(doc.get("username"));//不高亮
u.setUsername(this.getHighLight(doc,analyzer,query,"username"));//使用高亮
users.add(u);
}
searcher.close();
reader.close();
longendTime=newDate().getTime();
System.out.println("检索花费了"+(endTime-startTime)+"毫秒来把数据从"+indexPath+"里面检索出来!");
for(Useru:users){
System.out.println("以下是检索结果:"+u.getUsername()+"---"+u.getId());
}
returnSUCCESS;
}
5、高亮方法
publicStringgetHighLight(Documentdoc,Analyzeranalyzer,Queryquery,Stringfield)throwsException{
//设置高亮显示格式
SimpleHTMLFormattersimpleHTMLFormatter=newSimpleHTMLFormatter("<fontcolor='red'><strong>","</strong></font>");
/*语法高亮显示设置*/
Highlighterhighlighter=newHighlighter(simpleHTMLFormatter,newQueryScorer(query));
highlighter.setTextFragmenter(newSimpleFragmenter(100));
//取field字段值,准备进行高亮
StringfieldValue=doc.get(field);
TokenStreamtokenStream=analyzer.tokenStream(field,newStringReader(fieldValue));
//转成高亮的值
StringhighLightFieldValue=highlighter.getBestFragment(tokenStream,fieldValue);
if(highLightFieldValue==null)
highLightFieldValue=fieldValue;
returnhighLightFieldValue;
}
PS:还有几个全局变量:
privateStringkeyword;
privateList<User>users;
以上代码是在ssh框架中实现的,代码不好打包上传。