对于 <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包拷贝到 程序中,调用上述代码。