Lucene高亮显示
public static List search(String[] fields, String keyword)
throws IOException, InvalidTokenOffsetsException {
ArrayList list = new ArrayList();
IndexSearcher isearcher = null;
IKSimilarity iKSimilarity = new IKSimilarity();
Directory dir = new SimpleFSDirectory(new File(indexDir));
IndexReader indexReader = IndexReader.open(dir, true);
isearcher = new IndexSearcher(indexReader);
Analyzer analyzer = new IKAnalyzer();
isearcher.setSimilarity(iKSimilarity);
// QueryParser parser = new
// QueryParser(Version.LUCENE_30,field,analyzer);
Query query = IKQueryParser.parseMultiField(fields, keyword);
TopScoreDocCollector collector = TopScoreDocCollector.create(100, false);
isearcher.search(query, collector);
// TopDocs topDocs = isearcher.search(query , 5);
TopDocs topDocs = collector.topDocs();
ScoreDoc[] scoreDocs = topDocs.scoreDocs;
for (int i = 0; i < scoreDocs.length; i++) {
Document doc = isearcher.doc(scoreDocs[i].doc);
/** 高亮显示的关键步骤 **/
SimpleHTMLFormatter simpleHtmlFormatter = new SimpleHTMLFormatter("<font color='red'>","</font>");
Highlighter highlighter = new Highlighter(simpleHtmlFormatter,new QueryScorer(query));
highlighter.setTextFragmenter(new SimpleFragmenter(50));
String goal= doc.get("goal");
String highlightGoal = "";
if(!goal.equals("")){
TokenStream tokenStream = analyzer.tokenStream("goal",new StringReader(goal));
highlightGoal = highlighter.getBestFragment(tokenStream, goal);
/** 注意 ***/
if(highlightGoal==null){
highlightGoal = goal;
}
}
/** 封装高亮信息 **/
Info info = new Info();
info.setNo(doc.getField("no").stringValue());
info.setWeight(isearcher.explain(query, scoreDocs[i].doc).getValue());
info.setGoal(highlightGoal);
list.add(info);
}
return list;
}
在做这个例子的过程中遇到了一个问题,出现在
if(highlightGoal==null){
highlightGoal = goal;
}
如果goal中没有关键词 词元,highlightGoal就会为null