欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-16 09:08:55
...

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

相关标签: lucene F# HTML