Lucene —— 搜索结果高亮显示

时间:2022-01-12 09:09:39
零. 前言
谷歌、 百度的搜索结果在关键词命中的时候会高亮显示(飘红), 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> 标签