Lucene检索高亮显示,直接上代码,使用了林良益的IKAnalyzer:
创建的索引:
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>开发框架各取所长