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

本文介绍Lucene高亮显示的实现原理与步骤,包括如何通过Highlighter组件进行文本高亮,涉及的主要部分有段划分器、计分器及格式化器等。此外还提供了示例代码展示如何设置参数并获取高亮后的文本片段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值