高亮顯示,其實就是加入樣式

高亮
做用:
截取一段摘要
高亮顯示其中的關鍵字
配置:
摘要大小(字數)
關鍵字的高亮效果(前綴、後綴,示例:<font color='red'>關鍵字</font>)
代碼:java

 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 }
相關文章
相關標籤/搜索