高亮
做用:
截取一段摘要
高亮顯示其中的關鍵字
配置:
摘要大小(字數)
關鍵字的高亮效果(前綴、後綴,示例:<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 }