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

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>开发框架各取所长

你可能感兴趣的:(apache,框架,struts,Lucene,Webwork)