首页 > 代码库 > 高亮显示,其实就是加入样式

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

高亮
作用:
截取一段摘要
高亮显示其中的关键字
配置:
摘要大小(字数)
关键字的高亮效果(前缀、后缀,示例:<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     @Test30     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             // 一次高亮一个字段,返回高亮后的结果,如果要高亮的字段值中没有出现关键字,就会返回null64             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转为Article71             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 }