高亮显示,其实就是加入样式

高亮
作用:
截取一段摘要
高亮显示其中的关键字
配置:
摘要大小(字数)
关键字的高亮效果(前缀、后缀,示例:<font color='red'>关键字</font>)
代码:

 1 package cn.itcast.f_highlight;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import org.apache.lucene.document.Document;
 7 import org.apache.lucene.index.IndexWriter.MaxFieldLength;
 8 import org.apache.lucene.queryParser.MultiFieldQueryParser;
 9 import org.apache.lucene.queryParser.QueryParser;
10 import org.apache.lucene.search.IndexSearcher;
11 import org.apache.lucene.search.Query;
12 import org.apache.lucene.search.TopDocs;
13 import org.apache.lucene.search.highlight.Formatter;
14 import org.apache.lucene.search.highlight.Highlighter;
15 import org.apache.lucene.search.highlight.QueryScorer;
16 import org.apache.lucene.search.highlight.Scorer;
17 import org.apache.lucene.search.highlight.SimpleFragmenter;
18 import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
19 import org.apache.lucene.util.Version;
20 import org.junit.Test;
21 
22 import cn.itcast._domain.Article;
23 import cn.itcast._util.ArticleDocumentUtils;
24 import cn.itcast._util.LuceneUtils;
25 
26 public class TestApp {
27 
28     // 搜索
29     @Test
30     public void testSearch() throws Exception {
31         // 准备查询条件
32         String queryString = "互联网";
33 
34         // 执行搜索
35         List<Article> list = new ArrayList<Article>();
36 
37         // 1,把查询字符串转为Query对象(从title和content中查询)
38         QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30, new String[] { "title", "content" }, LuceneUtils.getAnalyzer());
39         Query query = queryParser.parse(queryString);
40 
41         // 2,执行查询,得到中间结果
42         IndexSearcher indexSearcher = new IndexSearcher(LuceneUtils.getDirectory()); // 指定所用的索引库
43         TopDocs topDocs = indexSearcher.search(query, 100); // 最多返回前n条结果
44 
45         // ========================================================================================== 【创建高亮器】
46         Query myQuery = query; // 查询条件
47         String preTag = "<span class='keyword'>"; // 前缀
48         String postTag = "</span>"; // 后缀
49         int size = 20; // 摘要大小,以关键字为中心
50 
51         Formatter formatter = new SimpleHTMLFormatter(preTag, postTag); // 前缀、后缀
52         Scorer scorer = new QueryScorer(myQuery);
53         Highlighter highlighter = new Highlighter(formatter, scorer);
54         highlighter.setTextFragmenter(new SimpleFragmenter(size)); // 摘要大小(字数)
55         // ==========================================================================================
56 
57         // 3,处理结果
58         for (int i = 0; i < topDocs.scoreDocs.length; i++) {
59             // 根据编号拿到Document数据
60             int docId = topDocs.scoreDocs[i].doc; // Document的内部编号
61             Document doc = indexSearcher.doc(docId);
62             // ======================================================================================== 【使用高亮器】
63             // 一次高亮一个字段,返回高亮后的结果,如果要高亮的字段值中没有出现关键字,就会返回null
64             String text = highlighter.getBestFragment(LuceneUtils.getAnalyzer(), "content", doc.get("content"));
65             if (text != null) {
66                 doc.getField("content").setValue(text); // 使用高亮后的文本替换原始内容
67             }
68             // ========================================================================================
69 
70             // 把Document转为Article
71             Article article = ArticleDocumentUtils.documentToArticle(doc);
72             list.add(article);
73         }
74         indexSearcher.close();
75 
76         // 显示结果
77         System.out.println("总结果数:" + list.size());
78         for (Article a : list) {
79             System.out.println("------------------------------");
80             System.out.println("id = " + a.getId());
81             System.out.println("title = " + a.getTitle());
82             System.out.println("content = " + a.getContent());
83         }
84     }
85 }
原文地址:https://www.cnblogs.com/friends-wf/p/3796634.html