全文检索例子.docx

上传人:b****5 文档编号:7658363 上传时间:2023-01-25 格式:DOCX 页数:16 大小:17.88KB
下载 相关 举报
全文检索例子.docx_第1页
第1页 / 共16页
全文检索例子.docx_第2页
第2页 / 共16页
全文检索例子.docx_第3页
第3页 / 共16页
全文检索例子.docx_第4页
第4页 / 共16页
全文检索例子.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

全文检索例子.docx

《全文检索例子.docx》由会员分享,可在线阅读,更多相关《全文检索例子.docx(16页珍藏版)》请在冰豆网上搜索。

全文检索例子.docx

全文检索例子

本文由美白面膜排行榜整理

全文检索例子

lucene3搜索引擎,索引建立搜索排序分页高亮显示,IKAnalyzer分词

publicclassLuceneService{

privatefinalLoglogger=LogFactory.getLog(LuceneService.class);

privatefinalStringdirPath="d:

/temp/user";

Analyzeranalyzer=newIKAnalyzer();

Directorydirectory=null;

IndexWriterwriter=null;

IndexSearcherindexSearcher=null;

privatevoidconfirmDirs(){

FileindexFile=newFile(dirPath);

if(!

indexFile.exists()){

indexFile.mkdirs();

}

if(!

indexFile.exists()||!

indexFile.canWrite()){

if(logger.isDebugEnabled())

logger.error("索引文件目录创建失败或不可写入!

");

}

}

publicvoidinit(){

confirmDirs();

try{

Filef=newFile(dirPath);

directory=FSDirectory.open(f);

}catch(Exceptione){

if(logger.isDebugEnabled()){

logger.error("解除索引文件锁定失败!

"+e.getCause());

}

}

}

publicvoidcreateIndex(List<User>userList){

init();

try{

//第一个参数是存放索引目录有FSDirectory(存储到磁盘上)和RAMDirectory(存储到内存中),

//第二个参数是使用的分词器,第三个:

true,建立全新的索引,false,建立增量索引,第四个是建立的索引的最大长度

writer=newIndexWriter(directory,analyzer,true,IndexWriter.MaxFieldLength.LIMITED);

writer.setMergeFactor(500);

writer.setMaxBufferedDocs(155);

writer.setMaxFieldLength(Integer.MAX_VALUE);

writeIndex(writer,userList);

writer.optimize();

writer.close();

}catch(IOExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

}

publicList<User>search(Stringkeyword){

FileindexFile=newFile(dirPath);

if(!

indexFile.exists()){

returnnull;

}

Directorydir;

try{

dir=FSDirectory.open(indexFile);

indexSearcher=newIndexSearcher(dir);

indexSearcher.setSimilarity(newIKSimilarity());

//单字段查询,单条件查询

//Queryquery=IKQueryParser.parse("userInfo",keyword);

//多字段,单条件查询

String[]fields=newString[]{"userInfo","parameter1"};

Queryquery=IKQueryParser.parseMultiField(fields,keyword);

//多字体,单条件,多BooleanClause.Occur[]flags,查询条件的组合方式(Or/And)

//BooleanClause.Occur[]数组,它表示多个条件之间的关系,

//BooleanClause.Occur.MUST表示and,

//BooleanClause.Occur.MUST_NOT表示not,

//BooleanClause.Occur.SHOULD表示or.

//String[]fields=newString[]{"userInfo","parameter1"};

//BooleanClause.Occur[]flags=new

//BooleanClause.Occur[]{BooleanClause.Occur.MUST,BooleanClause.Occur.SHOULD};

//Queryquery=IKQueryParser.parseMultiField(fields,

//keyword,flags);

////多Field,多条件查询分析

//String[]fields=newString[]{"userInfo","parameter1"};

//String[]queries=newString[]{keyword,keyword};

//Queryquery=IKQueryParser.parseMultiField(fields,queries);

//多Field,多条件,多Occur查询

//String[]fields=newString[]{"userInfo","parameter1"};

//String[]queries=newString[]{keyword,keyword};

//BooleanClause.Occur[]flags=new

//BooleanClause.Occur[]{BooleanClause.Occur.MUST,BooleanClause.Occur.SHOULD};

//Queryquery=

//IKQueryParser.parseMultiField(fields,queries,flags);

//搜索相似度最高的20条记录

TopDocstopDocs=indexSearcher.search(query,20);

ScoreDoc[]hits=topDocs.scoreDocs;

returnhitsToQuery(hits,query);

}catch(IOExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

returnnull;

}

privateList<User>hitsToQuery(ScoreDoc[]hits,Queryquery){

List<User>list=newArrayList<User>();

try{

for(inti=0;i<hits.length;i++){

Useru=newUser();

Documentdoc=indexSearcher.doc(hits[i].doc);

u.setUserId(Integer.parseInt(doc.get("userId")));

u.setUserName(doc.get("userName"));

u.setUserAge(Integer.parseInt(doc.get("userAge")));

//高亮设置

SimpleHTMLFormattersimpleHtmlFormatter=newSimpleHTMLFormatter(

"<fontcolor=\"red\">","</font>");

Highlighterhighlighter=newHighlighter(simpleHtmlFormatter,

newQueryScorer(query));

TokenStreamtokenStream=analyzer.tokenStream("text",

newStringReader(doc.get("userInfo")));

StringuserInfo=highlighter.getBestFragment(tokenStream,doc

.get("userInfo"));

if(userInfo!

=null){

u.setUserInfo(userInfo);

}else{

u.setUserInfo(doc.get("userInfo"));

}

SimpleHTMLFormattersimpleHtmlFormatter1=newSimpleHTMLFormatter(

"<fontcolor=\"red\">","</font>");

Highlighterhighlighter1=newHighlighter(

simpleHtmlFormatter1,newQueryScorer(query));

TokenStreamtokenStream1=analyzer.tokenStream("text1",

newStringReader(doc.get("parameter1")));

Stringp1=highlighter1.getBestFragment(tokenStream1,doc

.get("parameter1"));

if(p1!

=null){

u.setParameter1(p1);

}else{

u.setParameter1(doc.get("parameter1"));

}

u.setParameter2(doc.get("parameter2"));

u.setParameter3(doc.get("parameter3"));

u.setParameter4(doc.get("parameter4"));

list.add(u);

}

indexSearcher.close();

returnlist;

}catch(CorruptIndexExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}catch(IOExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}catch(InvalidTokenOffsetsExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

returnnull;

}

publicvoidwriteIndex(IndexWriterwriter,List<User>userList){

try{

for(Useru:

userList){

Documentdoc=getDoc(u);

writer.addDocument(doc);

}

}catch(IOExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

}

privateDocumentgetDoc(Useruser){

System.out.println("用户ID为"+user.getUserId()+"索引被创建");

Documentdoc=newDocument();

addField2Doc(doc,user,"userId",Store.YES,Index.NOT_ANALYZED);

addField2Doc(doc,user,"userName",Store.YES,Index.NOT_ANALYZED);//Index.NOT_ANALYZED

//不分词,但建立索引

addField2Doc(doc,user,"userAge",Store.YES,Index.NOT_ANALYZED);//Index.ANALYZED

//分词并且建立索引

addField2Doc(doc,user,"userInfo",Store.YES,Index.ANALYZED);

addField2Doc(doc,user,"parameter1",Store.YES,Index.ANALYZED);

addField2Doc(doc,user,"parameter2",Store.YES,Index.ANALYZED);

addField2Doc(doc,user,"parameter3",Store.YES,Index.ANALYZED);

addField2Doc(doc,user,"parameter4",Store.YES,Index.ANALYZED);

returndoc;

}

privatevoidaddField2Doc(Documentdoc,Objectbean,Stringname,Stores,

Indexi){

Stringvalue;

try{

value=BeanUtils.getProperty(bean,name);

if(value!

=null){

doc.add(newField(name,value,s,i,

Field.TermVector.WITH_POSITIONS_OFFSETS));

}

}catch(IllegalAccessExceptione){

logger.error("getbeanpropertyerror",e);

}catch(InvocationTargetExceptione){

logger.error("getbeanpropertyerror",e);

}catch(NoSuchMethodExceptione){

logger.error("getbeanpropertyerror",e);

}

}

/**

*没有排序,有高亮,有分页

*

*@parampageNo

*@parampageSize

*@paramkeyword

*@return

*/

publicPageBeangetPageQuery(intpageNo,intpageSize,Stringkeyword){

Listresult=newArrayList();

FileindexFile=newFile(dirPath);

if(!

indexFile.exists()){

returnnull;

}

Directorydir;

try{

dir=FSDirectory.open(indexFile);

indexSearcher=newIndexSearcher(dir);

indexSearcher.setSimilarity(newIKSimilarity());

String[]fields=newString[]{"userInfo","parameter1"};

BooleanClause.Occur[]flags=newBooleanClause.Occur[]{

BooleanClause.Occur.MUST,BooleanClause.Occur.SHOULD};

Queryquery=IKQueryParser.parseMultiField(fields,keyword,flags);

TopScoreDocCollectortopCollector=TopScoreDocCollector.create(

indexSearcher.maxDoc(),true);

indexSearcher.search(query,topCollector);

//查询当页的记录

ScoreDoc[]docs=topCollector.topDocs((pageNo-1)*pageSize,

pageSize).scoreDocs;

//String[]highlightCol={"userInfo","parameter1"};

//高亮设置

SimpleHTMLFormattersimpleHtmlFormatter=newSimpleHTMLFormatter(

"<fontcolor=\"red\">","</font>");

Highlighterhighlighter=newHighlighter(simpleHtmlFormatter,

newQueryScorer(query));

for(ScoreDocscdoc:

docs){

Useru=newUser();

Documentdoc=indexSearcher.doc(scdoc.doc);

//

//for(Fieldablefa:

doc.getFields()){

//System.out.println(fa.name());

//Stringvalue=doc.get(fa.name());

//for(Stringcol:

highlightCol){

//if(fa.name().equals(col)){

////设置高显内容

//TokenStreamtokenStream=analyzer.tokenStream("text",new

//StringReader(value));

//value=highlighter.getBestFragment(tokenStream,value);

//}

//}

//

//}

u.setUserId(Integer.parseInt(doc.get("userId")));

u.setUserName(doc.get("userName"));

u.setUserAge(Integer.parseInt(doc.get("userAge")));

TokenStreamtokenStream=analyzer.tokenStream("text",

newStringReader(doc.get("userInfo")));

StringuserInfo=highlighter.getBestFragment(tokenStream,doc

.get("userInfo"));

if(userInfo!

=null){

u.setUserInfo(userInfo);

}else{

u.setUserInfo(doc.get("userInfo"));

}

TokenStreamtokenStream1=analyzer.tokenStream("text1",

newStringReader(doc.get("parameter1")));

Stringp1=highlighter.getBestFragment(tokenStream1,doc

.get("parameter1"));

if(p1!

=null){

u.setParameter1(p1);

}else{

u.setParameter1(doc.get("parameter1"));

}

u.setParameter2(doc.get("parameter2"));

u.setParameter3(doc.get("parameter3"));

u.setParameter4(doc.get("parameter4"));

result.add(u);

}

PageBeanpb=newPageBean();

pb.setCurrentPage(pageNo);//当前页

pb.setPageSize(pageSize);

pb.setAllRow(topCollector.getTotalHits());//hit中的记录数目

pb.setList(result);

returnpb;

}catch(IOExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}catch(InvalidTokenOffsetsExceptione){

//TODOAuto-generatedcatchblock

e.pr

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1