零. 前言 谷歌、 百度的搜尋結果在關鍵詞命中的時候會高亮顯示(飄紅), 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();
}
}
}
二. 運作結果
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyNzcjM0gDMxIzMyIDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
執行成功 ,china 關鍵詞成功加上了 <font> 标簽