`
yj_0212
  • 浏览: 3540 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
社区版块
存档分类
最新评论

初学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
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics