public static String highConvert(String field,String value,Query query){
String highStr = null;
try {
Scorer scorer = new QueryScorer(query);
Highlighter highlighter = new Highlighter(formatter,scorer);
highlighter.setTextFragmenter(new SimpleFragmenter(max_subString));
highStr = highlighter.getBestFragment(analyzer,field,value);
if(highStr == null){
if(value.length()<max_subString){
return value;
}else{
return value.substring(max_subString);
}
}
} catch (Exception e) {
System.out.println("highLighter causes a error!\n"+e);
}
return highStr;
}
之前没有对getBestFragment ()的返回值进行判断,所以有时候获取不到数据,显示为null。
后来在网上查了好久,
Lucence中的highlighter除了高亮关键词之外还有动态摘要的功能,动态摘要就是将文本分成若干片段(fragment),选取一个或多个与查询最相关(scorer计算)的片段.有的论文中选取段时是从查询词所在位置向左右扩充选取,并且据一般习惯用户更多注意一段话的起始部分,一般是从一个语句的开始超过一定长度可以抛弃后面的部分而不是前面。
所以有时候由于段落过长查找超时或者里面没有关键词,他就会返回为null。
所以,我们需要对highlighter.getBestFragment 的返回值进行判断。
如果返回null,就保留原来的字符串(不进行高亮处理),然后再进行截取。
返回不为null,那就保留处理后的字符串。