首页 > 代码库 > 高亮显示,其实就是加入样式
高亮显示,其实就是加入样式
高亮
作用:
截取一段摘要
高亮显示其中的关键字
配置:
摘要大小(字数)
关键字的高亮效果(前缀、后缀,示例:<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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。