1. 程式人生 > >Lucene筆記34-Lucene的擴充套件-高亮基礎

Lucene筆記34-Lucene的擴充套件-高亮基礎

一、高亮顯示用到的類

  • Fragmenter:拿到一個字串之後,對字串進行分段
  • QueryScorer:查詢評分,將評分最高的展示給使用者
  • Encoder:顯示出來的文字有兩種,一種是SimpleEncode(忽略掉HTML標籤),一種是DefaultEncode(展示HTML標籤)
  • Formatter:自定義標註高亮文字標籤

二、程式碼例項

這裡簡單展示下高亮類的使用,對一個句子做了高亮顯示處理。可以發現輸出的內容中,關鍵詞被加上了span標籤。

package com.wsy;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.ParseException;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.highlight.*;
import org.apache.lucene.util.Version;
import org.wltea.analyzer.lucene.IKAnalyzer;

import java.io.IOException;

public class HighLightTest {
    private static String text = "我愛北京天安門, 天安門上太陽升, 偉大領袖毛主席, 指引我們向前進!";

    public void highLight1(String text) {
        Analyzer analyzer = new IKAnalyzer();
        try {
            // 只能對一個詞新增高亮
            // TermQuery query = new TermQuery(new Term("content", "天安門"));
            // 可以對多個詞新增高亮,多個關鍵詞用空格分隔開
            Query query = new QueryParser(Version.LUCENE_35, "content", analyzer).parse("北京 偉大");
            QueryScorer queryScorer = new QueryScorer(query);
            Fragmenter fragmenter = new SimpleSpanFragmenter(queryScorer);
            Formatter formatter = new SimpleHTMLFormatter("<span style='color:red'>", "</span>");
            Highlighter highlighter = new Highlighter(formatter, queryScorer);
            highlighter.setTextFragmenter(fragmenter);
            String highLightString = highlighter.getBestFragment(analyzer, "content", text);
            System.out.println(highLightString);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InvalidTokenOffsetsException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        HighLightTest highLightTest = new HighLightTest();
        highLightTest.highLight1(text);
    }
}