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框架中实现的,代码不好打包上传。

相关推荐