lucene 高亮 文件

    对于 <field name="newsField"       type="textMaxWord"  indexed="true"  stored="false"  multiValued="true"/>的字段来说,因为stored=false,所以没有默认高亮方式。

   我们可以自己获取文本(如数据库中的clob字段,pdf文件中的内容),然后再调用lucene的相关api实现。

  

import java.io.IOException;
import java.io.StringReader;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.highlight.Fragmenter;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.search.highlight.SimpleSpanFragmenter;
import com.chenlb.mmseg4j.analysis.MMSegAnalyzer;

/**
 * 高亮文本,适用于内容没有存储stored=false的域
 * @author Administrator
 *
 */
public class GetHighLighter {

	/**
	 * 获取高亮后的文本
	 * @param text   可以自己获取数据库中的文本,或者通过tika获取文件内容
	 * @param keyword
	 * @param fieldName
	 * @return
	 */
	public static String getHl(String text,String keyword,String fieldName){
		String result =  "";
		 try {
			 TermQuery query = new TermQuery(new Term(fieldName,keyword));
			 TokenStream tokenStream  = new MMSegAnalyzer().
			            tokenStream(fieldName, new StringReader(text));
			 QueryScorer score = new QueryScorer(query,fieldName);
			 Fragmenter  fragmenter = new SimpleSpanFragmenter(score,90);
			 
			 SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<span class='hl'>","</span>");
			 
			 Highlighter highlighter = new Highlighter(formatter,score);
			 highlighter.setTextFragmenter(fragmenter);
			 result = highlighter.getBestFragment(tokenStream, text);
			 
		} catch (IOException e) {
			e.printStackTrace();
		} catch (InvalidTokenOffsetsException e) {
			e.printStackTrace();
		}  
		 return result; 
	}
}


   solr中也没发现有高亮未存储域的方法,因此可以将lucene的相关jar包拷贝到 程序中,调用上述代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值