Lucene增加高亮显示后结果更高明显

Lucene增加高亮显示后结果更高明显了,但是返回结果的速度比较慢.原因是Lucene做每一篇文档的相关关键词的高亮显示时,在运行时执行了很多遍的分词操作,降低了性能.

TermVector保存Token.getPositionIncrement() Token.startOffset() 以及Token.endOffset() 信息。利用Lucene中新增加的Token信息的保存结果以后,就不需要为了高亮显示而在运行时解析每篇文档。通过Field方法控制是否保存该信息

 

Java代码 复制代码
  1. public void searcher() throws IOException{  
  2.           
  3.         IndexReader reader = IndexReader.open(directory);  
  4.           
  5.         IndexSearcher searcher = new IndexSearcher(directory);  
  6.           
  7.         TermQuery query = new TermQuery(new Term("subject","java"));  
  8.           
  9.         Hits hits = searcher.search(query);  
  10.           
  11.         //高亮显示设置  
  12.         SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<font color='red'>","</font>");     
  13.           
  14.         Highlighter highlighter =new Highlighter(simpleHTMLFormatter,new QueryScorer(query));  
  15.   
  16.          // 这个100是指定关键字字符串的context的长度,你可以自己设定,因为不可能返回整篇正文内容  
  17.         highlighter.setTextFragmenter(new SimpleFragmenter(100));  
  18.   
  19.         for(int i = 0; i < hits.length(); i++){  
  20.               
  21.             Document doc = hits.doc(i);  
  22.               
  23.             TermPositionVector termFreqVector = (TermPositionVector)reader.getTermFreqVector(hits.id(i), "subject");  
  24.               
  25.             TokenStream tokenStream = TokenSources.getTokenStream(termFreqVector);  
  26.               
  27.             String result = highlighter.getBestFragment(tokenStream, doc.get("subject"));  
  28.   
  29.             System.out.println(doc.get("title"));  
  30.               
  31.             System.out.println(result);  
  32.               
  33.         }  
  34.     }  
public void searcher() throws IOException{ 		 		IndexReader reader = IndexReader.open(directory); 		 		IndexSearcher searcher = new IndexSearcher(directory); 		 		TermQuery query = new TermQuery(new Term("subject","java")); 		 		Hits hits = searcher.search(query); 		 		//高亮显示设置 	    SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<font color='red'>","</font>");    	     		Highlighter highlighter =new Highlighter(simpleHTMLFormatter,new QueryScorer(query));  		 // 这个100是指定关键字字符串的context的长度,你可以自己设定,因为不可能返回整篇正文内容         highlighter.setTextFragmenter(new SimpleFragmenter(100));  		for(int i = 0; i < hits.length(); i++){ 			 			Document doc = hits.doc(i); 			 			TermPositionVector termFreqVector = (TermPositionVector)reader.getTermFreqVector(hits.id(i), "subject"); 			 			TokenStream tokenStream = TokenSources.getTokenStream(termFreqVector); 			 			String result = highlighter.getBestFragment(tokenStream, doc.get("subject"));  			System.out.println(doc.get("title")); 			 			System.out.println(result); 			 		} 	}


   从别处转的发现reader.getTermFreqVector(hits.id(i), "subject")总是返回空值

 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值