使用highlighter的时候,一般会用query来构造:
Highlighter highlighter = new Highlighter(new QueryScorer(query));
这样存在一个问题,如果已经通过查询检索出结果,想对结果文本中的关键字进行高亮,使用这种写法是有问题的。当highlighter.getBestFragment会进行再一次查询,输出高亮片段,然而我们并不需要再一次查询。
查源码后发现QueryScorer中有这个构造方法:
public QueryScorer(WeightedSpanTerm[] weightedTerms)
通过这个scorer创建highlighter,会对文本中的关键字进行高亮而不再进行查询,高亮过程不再需要query。如下写法:
WeightedSpanTerm wst = new WeightedSpanTerm(1, "关键字");
QueryScorer qs = new QueryScorer(new WeightedSpanTerm[]{wst});
Highlighter hl = new Highlighter(qs);
String result = hl.getBestFragment(analyzer, "column1",text);
达到我们想要的结果,仅对查询结果文本进行关键字高亮,不再次进行查询。