【Lucene3.6.2入门系列】第11节_高亮

[java]  view plain copy print ?
  1. package com.jadyer.lucene;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5.   
  6. import org.apache.lucene.analysis.Analyzer;  
  7. import org.apache.lucene.document.Document;  
  8. import org.apache.lucene.document.Field;  
  9. import org.apache.lucene.index.IndexReader;  
  10. import org.apache.lucene.index.IndexWriter;  
  11. import org.apache.lucene.index.IndexWriterConfig;  
  12. import org.apache.lucene.queryParser.MultiFieldQueryParser;  
  13. import org.apache.lucene.queryParser.QueryParser;  
  14. import org.apache.lucene.search.IndexSearcher;  
  15. import org.apache.lucene.search.Query;  
  16. import org.apache.lucene.search.ScoreDoc;  
  17. import org.apache.lucene.search.TopDocs;  
  18. import org.apache.lucene.search.highlight.Formatter;  
  19. import org.apache.lucene.search.highlight.Fragmenter;  
  20. import org.apache.lucene.search.highlight.Highlighter;  
  21. import org.apache.lucene.search.highlight.QueryScorer;  
  22. import org.apache.lucene.search.highlight.SimpleHTMLFormatter;  
  23. import org.apache.lucene.search.highlight.SimpleSpanFragmenter;  
  24. import org.apache.lucene.store.Directory;  
  25. import org.apache.lucene.store.FSDirectory;  
  26. import org.apache.lucene.util.Version;  
  27. import org.apache.tika.Tika;  
  28.   
  29. import com.chenlb.mmseg4j.analysis.MMSegAnalyzer;  
  30.   
  31. /** 
  32.  * 【Lucene3.6.2入门系列】第11节_高亮 
  33.  * @see 高亮功能属于Lucene的扩展功能(或者叫做贡献功能) 
  34.  * @see 其所需jar位于Lucene-3.6.2.zip中的/contrib/highlighter/文件夹中 
  35.  * @see 本例中需要以下4个jar 
  36.  * @see lucene-core-3.6.2.jar 
  37.  * @see lucene-highlighter-3.6.2.jar 
  38.  * @see mmseg4j-all-1.8.5-with-dic.jar 
  39.  * @see tika-app-1.4.jar 
  40.  * @create Aug 7, 2013 11:37:10 AM 
  41.  * @author 玄玉<http://blog.csdn.net/jadyer> 
  42.  */  
  43. public class HelloHighLighter {  
  44.     private Directory directory;  
  45.     private IndexReader reader;  
  46.       
  47.     public HelloHighLighter(){  
  48.         Document doc = null;  
  49.         IndexWriter writer = null;  
  50.         try{  
  51.             directory = FSDirectory.open(new File("myExample/myIndex/"));  
  52.             writer = new IndexWriter(directory, new IndexWriterConfig(Version.LUCENE_36, new MMSegAnalyzer()));  
  53.             writer.deleteAll();  
  54.             for(File myFile : new File("myExample/myFile/").listFiles()){  
  55.                 doc = new Document();  
  56.                 doc.add(new Field("filecontent"new Tika().parse(myFile))); //Field.Store.NO,Field.Index.ANALYZED  
  57.                 doc.add(new Field("filepath", myFile.getAbsolutePath(), Field.Store.YES, Field.Index.NOT_ANALYZED_NO_NORMS));  
  58.                 writer.addDocument(doc);  
  59.             }  
  60.         }catch(Exception e) {  
  61.             e.printStackTrace();  
  62.         }finally{  
  63.             if(null != writer){  
  64.                 try {  
  65.                     writer.close();  
  66.                 } catch (IOException ce) {  
  67.                     ce.printStackTrace();  
  68.                 }  
  69.             }  
  70.         }  
  71.     }  
  72.       
  73.       
  74.     /** 
  75.      * 获取IndexSearcher实例 
  76.      */  
  77.     private IndexSearcher getIndexSearcher(){  
  78.         try {  
  79.             if(reader == null){  
  80.                 reader = IndexReader.open(directory);  
  81.             }else{  
  82.                 //if the index was changed since the provided reader was opened, open and return a new reader; else,return null  
  83.                 //如果当前reader在打开期间index发生改变,则打开并返回一个新的IndexReader,否则返回null  
  84.                 IndexReader ir = IndexReader.openIfChanged(reader);  
  85.                 if(ir != null){  
  86.                     reader.close(); //关闭原reader  
  87.                     reader = ir;    //赋予新reader  
  88.                 }  
  89.             }  
  90.             return new IndexSearcher(reader);  
  91.         }catch(Exception e) {  
  92.             e.printStackTrace();  
  93.         }  
  94.         return null//发生异常则返回null  
  95.     }  
  96.       
  97.       
  98.     /** 
  99.      * 高亮搜索 
  100.      * @see 高亮搜索时,不建议把高亮信息存到索引里,而是搜索到内容之后再进行高亮处理 
  101.      * @see 这里用的是MMSeg4j中文分词器,有关其介绍详见http://blog.csdn.net/jadyer/article/details/10049525 
  102.      * @param expr 搜索表达式 
  103.      */  
  104.     public void searchByHignLighter(String expr){  
  105.         Analyzer analyzer = new MMSegAnalyzer();  
  106.         IndexSearcher searcher = this.getIndexSearcher();  
  107.         //搜索多个Field  
  108.         QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_36, new String[]{"filepath""filecontent"}, analyzer);  
  109.         try {  
  110.             Query query = parser.parse(expr);  
  111.             TopDocs tds = searcher.search(query, 50);  
  112.             for(ScoreDoc sd : tds.scoreDocs){  
  113.                 Document doc = searcher.doc(sd.doc);  
  114.                 //获取文档内容  
  115.                 String filecontent = new Tika().parseToString(new File(doc.get("filepath")));  
  116.                 System.out.println("搜索到的内容为[" + filecontent + "]");  
  117.                 //开始高亮处理  
  118.                 QueryScorer queryScorer = new QueryScorer(query);  
  119.                 Fragmenter fragmenter = new SimpleSpanFragmenter(queryScorer, filecontent.length());  
  120.                 Formatter formatter = new SimpleHTMLFormatter("<span style='color:red'>""</span>");  
  121.                 Highlighter hl = new Highlighter(formatter, queryScorer);  
  122.                 hl.setTextFragmenter(fragmenter);  
  123.                 System.out.println("高亮后的内容为[" + hl.getBestFragment(analyzer, "filecontent", filecontent) + "]");  
  124.             }  
  125.         } catch (Exception e) {  
  126.             e.printStackTrace();  
  127.         } finally {  
  128.             if(null != searcher){  
  129.                 try {  
  130.                     searcher.close(); //记得关闭IndexSearcher  
  131.                 } catch (IOException e) {  
  132.                     e.printStackTrace();  
  133.                 }  
  134.             }  
  135.         }  
  136.     }  
  137.   
  138.       
  139.     /** 
  140.      * 高亮的使用方式 
  141.      * @see 这里用的是MMSeg4j中文分词器,有关其介绍详见http://blog.csdn.net/jadyer/article/details/10049525 
  142.      */  
  143.     private static void testHighLighter(){  
  144.         String fieldName = "myinfo"//这个可以随便写,就是起个标识的作用  
  145.         String text = "我来自中国黑龙江省哈尔滨市巴彦县兴隆镇长春乡民权村4队";  
  146.         QueryParser parser = new QueryParser(Version.LUCENE_36, fieldName, new MMSegAnalyzer());  
  147.         try {  
  148.             //MMSeg4j的new MMSegAnalyzer()默认只会对'中国'和'兴隆'进行分词,所以这里就只高亮它们俩了  
  149.             Query query = parser.parse("中国 兴隆");  
  150.             //针对查询出来的文本,查询其评分,以便于能够根据评分决定显示情况  
  151.             QueryScorer queryScorer = new QueryScorer(query);  
  152.             //对字符串或文本进行分段,SimpleSpanFragmenter构造方法的第二个参数可以指定高亮的文本长度,默认为100  
  153.             Fragmenter fragmenter = new SimpleSpanFragmenter(queryScorer);  
  154.             //高亮时的高亮格式,默认为<B></B>,这里指定为红色字体  
  155.             Formatter formatter = new SimpleHTMLFormatter("<span style='color:red'>""</span>");  
  156.             //Highlighter专门用来做高亮显示  
  157.             //该构造方法还有一个参数为Encoder,它有两个实现类DefaultEncoder和SimpleHTMLEncoder  
  158.             //SimpleHTMLEncoder可以忽略掉HTML标签,而DefaultEncoder则不会忽略HTML标签  
  159.             Highlighter hl = new Highlighter(formatter, queryScorer);  
  160.             hl.setTextFragmenter(fragmenter);  
  161.             System.out.println(hl.getBestFragment(new MMSegAnalyzer(), fieldName, text));  
  162.         } catch (Exception e) {  
  163.             e.printStackTrace();  
  164.         }  
  165.     }  
  166.       
  167.       
  168.     /** 
  169.      * 小测试一下 
  170.      */  
  171.     public static void main(String[] args) {  
  172.         //测试高亮的基本使用效果  
  173.         HelloHighLighter.testHighLighter();  
  174.         //测试高亮搜索的效果(测试前记得在myExample/myFile/文件夹中准备一个或多个内容包含"依赖"的doc或pdf的等文件)  
  175.         new HelloHighLighter().searchByHignLighter("依赖");  
  176.     }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值