初学Lucene,写了个检索高亮显示

创建的索引:

import java.io.File;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.store.FSDirectory;
import org.wltea.analyzer.lucene.IKAnalyzer;

public class IndexFile {

private static final String INDEX_FILE = "E:\\lucene-indexs";

public static void createIndexFile()
{
String fielname = "content";
String text = "Struts是目前世界上所有使用Java语言进行J2EE项目开发的人员经常使用的基于MVC模式的Web项目开发框架之一。" +
"它也是目前最早的Web项目开发框架。由于它的易学易用,对入门者来说学习所花时间少,也简单容易上手,因此使用Struts的" +
"开发人群是目前所有Web项目开发框架使用人群中最大的。可是近几年,新的视图技术,如FreeMarker、Velocity技术。" +
"还有设计模式的大行其道。开发人员越来越觉得Struts在这些方面有先天的不足。并不能很优雅和优秀的完成Web项目开发工作。" +
"原因有很多种,一方面是Struts出现的时间比较早,现在流行的技术都是在Struts后出现的。因此必然导致Struts对新技术的" +
"支持不够。另一方面很多新兴的Web项目开发框架都是很好的体现了现有开发理念的使用。对Struts的影响和威胁都很大。" +
"这样很多近几年参加工作的IT从业人员都不喜欢使用Struts,而是去采用Tapestry、JSF等框架去进行他们的开发工作。" +
"值得庆幸的是Struts的开发人员也意识到了Struts的这些缺点,因此在2006年Struts和另外一个Web项目开发框架WebWork" +
"进行了合并,形成了新的Web项目开发框架Struts2。这个所谓的Struts2其实就是WebWork的一个新版本。" +
"一方面WebWork在IOC,基于接口编程,新的视图技术支持等方面具有先天优势,另一方面Struts的使用人群的巨大以及学习" +
"曲线的平缓,还有它的技术延续性。使这两个项目开发框架各取所长,互相补充,形成了一个更有竞争力,更具有健壮性的新框架。" +
"所以Struts并没有过时,它也已经进化成一个崭新的Web项目开发框架。" +
"本书这部分就针对Struts2的具体技术细节进行了详细附例的说明。而本章则把Struts和Struts2之间的“恩恩怨怨”以及同类" +
"的Web项目开发框架产品和Struts2的关系具体介绍。希望读者在学习Struts2技术之前,能对Struts2有清晰正确的认识和" +
"了解";

File indexFile = new File( INDEX_FILE );
IndexWriter indexWriter = null;
Document doc = null;
Analyzer analyzer = null;

try
{
analyzer = new IKAnalyzer();
indexWriter = new IndexWriter( FSDirectory.open( indexFile ), analyzer, true, IndexWriter.MaxFieldLength.LIMITED );

doc = new Document();
doc.add( new Field( fielname, text, Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS ) );
indexWriter.addDocument(doc);
indexWriter.optimize();
indexWriter.close();
}
catch( Exception e )
{
e.printStackTrace();
}

}

public static void main(String[] args) {
createIndexFile();
}
}

检索索引文件:

import java.io.File;

import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.document.Document;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.TermPositionVector;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleFragmenter;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.search.highlight.TokenSources;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.wltea.analyzer.lucene.IKQueryParser;
import org.wltea.analyzer.lucene.IKSimilarity;

public class SearchFile {

private static final String INDEX_FILE = "E:\\lucene-indexs";

public static void search( String keyword )
{
File indexFile = new File( INDEX_FILE );

String fieldname = "content";

IndexSearcher indexSearcher = null;
Directory dir = null;
IndexReader reader = null;
Document doc = null;

try
{
dir = FSDirectory.open( indexFile );

indexSearcher = new IndexSearcher( dir, true );
indexSearcher.setSimilarity( new IKSimilarity() );

reader = IndexReader.open( dir, true );

Query query = IKQueryParser.parse( fieldname, keyword );

SimpleHTMLFormatter shf = new SimpleHTMLFormatter( "<b><font color='#ff0000'>", "</font></b>" );
Highlighter highlighter =new Highlighter( shf, new QueryScorer( query ) );
highlighter.setTextFragmenter(new SimpleFragmenter( 50 ));

TopDocs topDocs = indexSearcher.search( query, 50);
ScoreDoc[] scoreDocs = topDocs.scoreDocs;

for( ScoreDoc sdoc : scoreDocs )
{
int currIndex = sdoc.doc;

TermPositionVector tpv = (TermPositionVector)reader.getTermFreqVector( currIndex ,fieldname);

TokenStream tokenStream = TokenSources.getTokenStream(tpv, true);

doc = indexSearcher.doc( currIndex );

String content = doc.get( fieldname );
String result = highlighter.getBestFragments( tokenStream, content, 2, "......");

tokenStream.close();

System.out.println( "检索结果:\n"+result );

}

indexSearcher.close();

}
catch( Exception e )
{
e.printStackTrace();
}
finally
{
try
{
if( reader != null )
{
reader.close();
reader = null;
}
if( indexSearcher != null )
{
indexSearcher.close();
indexSearcher = null;
}
}
catch( Exception e )
{
e.printStackTrace();
}

}

}

public static void main(String[] args) {

search( "曲线平缓 视图 ioc 项目" );

}
}

检索结果是:


一个新版本。一方面WebWork在<b><font color='#ff0000'>IOC</font></b>,基于接口编程,新的<b><font color='#ff0000'>视图</font></b>技术支持等方面具有先天优势,另一方面Struts的使用人群的巨大以及学习<b><font color='#ff0000'>曲线</font></b>的<b><font color='#ff0000'>平缓</font></b>,还有它的技术延续性。使这两个<b><font color='#ff0000'>项目</font></b>开发框架各取所长
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值