1、Highlighte包含三个主要部分:
1)段划分器:Fragmenter
2)计分器:Scorer
3)格式化器:Formatter
2、不仅需要你提供记分器和需要高亮显示的文本,还需要一个TokenStream实例。这个TokenStream实例由分析器生成。我们提供的文本用于生成TokenStream,这个TokenStream被用作高亮显示的原始文本。
3、Highlighter利用Fragmenter将原始文本分割成片段,大小可控制
4、QueryScorer为内置的计分器,基于项的加权因子给片段加权。必须对查询的原始形式进行重写,以便QueryScorer使用,被重写为BooleanQuery中所使用的项。在将Query实例传递到QueryScorer之前,可以调用Query.rewrite(IndexReader)方法来重写Query对象。
5、格式化器用于装饰项文本。不指定格式化器,会默认使用内置的SimpleHTMLFormatter。
6、示例
public static void main(String[] args) throws IOException{
Stringfilename=args[0];
if (filename==null){
System.err.println("USAGE:HighlightIt<filename>");
System.exit(-1);
}
TermQuery query=newTermQuery(new Term("f","ipsum"));
QueryScorer scorer=newQueryScorer(query);
//定义标注高亮文本的标签
SimpleHTMLFormatterformatter=
new SimpleHTMLFormatter("<span Highlighter highlighter=newHighlighter(formatter,scorer);
Fragmenterfragmenter=new SimpleFragmenter(50);//减少片断的默认大小
highlighter.setTextFragmenter(fragmenter);
//原始文本语汇单元化
TokenStream tokenstream=newStandardAnalyzer().tokenStream("f",new StringReader(text));
//高亮显示5个匹配最好的片断
Strinresult=highlighter.getBestFragments(tokenstream,text,5,"...");
FileWriter writer=newFileWriter(filename);
writer.write("<html>");
//写入用于高亮显示的HTML
writer.write("<style>\n"+".highlight{\n"+"backgroud:yellow;\n"+"}\n"+"</style>");
writer.write("<body>");
writer.(result);
writer.write("</body></html>");
writer.close();
}
具体使用说明如下:
1)建立索引时,在文档相关字段记录词条的位置
Field f = new Field(FIELD_NAME, text ,
Field.Store.YES, Field.Index.TOKENIZED,
Field.TermVector.WITH_POSITIONS_OFFSETS);
d.add(f);
2)构造HighLighter对象
Highlighter highlighter =new Highlighter(new QueryScorer(query));
3)设置文本分块
highlighter.setTextFragmenter(new SimpleFragmenter(20));
建立TermPositionVector 对象
TermPositionVector tpv = (TermPositionVector)reader.getTermFreqVector(hits.id(i),FIELD_NAME);//hits.id(i)返回文档编号
4)设定分隔
int maxNumFragmentsRequired = 3;
String fragmentSeparator = "...";
5)高亮处理
TokenStream tokenStream=TokenSources.getTokenStream(tpv);
//如果没有stop words去除还可以改成 TokenSources.getTokenStream(tpv,true); 进一步提速。
6)得到结果 String result =
highlighter.getBestFragments(
tokenStream,
text,
maxNumFragmentsRequired,
fragmentSeparator);