lucene-使用Highlighter高亮显示查询项

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);

你可能感兴趣的:(html,F#,Lucene)