天天看點

Lucene —— 搜尋結果高亮顯示

零. 前言 谷歌、 百度的搜尋結果在關鍵詞命中的時候會高亮顯示(飄紅), Lucene 也提供了高亮顯示的實作, 借助 Lucene 的 Highlighter 類可以快速實作搜尋結果高亮。

一. 代碼示例

本例使用 Lucene 5.3.1 的包 

package com.wenniuwuren.lucene;

import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.highlight.Highlighter;
import org.apache.lucene.search.highlight.QueryScorer;
import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
import org.apache.lucene.search.highlight.SimpleSpanFragmenter;

import java.io.StringReader;

/**
 * 搜尋結果高亮顯示: 整體思路就是找到關鍵詞, 然後在關鍵詞兩側加入渲染标簽, 達到高亮效果
 * Created by wenniuwuren on 16/2/22.
 */
public class HighlightTest {
    public static void main(String args[]) {

        try {
            // 将被處理的文本
            String searchResult = "chinese live in china";

            // 建立查詢
            Query query = new TermQuery(new Term("country", "china"));

            // 對于符合條件的結果進行 score
            QueryScorer queryScorer = new QueryScorer(query, "country");

            // 自定義高亮格式
            SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter("<font color='red'>", "</font>");

            Highlighter highlighter = new Highlighter(simpleHTMLFormatter, queryScorer);
            // 設定片段插入資訊
            highlighter.setTextFragmenter(new SimpleSpanFragmenter(queryScorer));

            // 分詞器, 這個隻能分英文
            StandardAnalyzer analyzer = new StandardAnalyzer();

            // 結果處理
            TokenStream tokenStream = analyzer.tokenStream("country", new StringReader(searchResult));
            String finalResult = highlighter.getBestFragment(tokenStream, searchResult);

            System.out.println(finalResult);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}           

二. 運作結果

Lucene —— 搜尋結果高亮顯示

執行成功 ,china 關鍵詞成功加上了 <font> 标簽