EffortsRun 2011-10-24
1. 使用高亮器。
2. 高亮原理?
例如,你要关键字红色?其实就是在匹配出的关键字加上一个前缀后缀。
例如<font color="red">全文检索</font>
3. 如何构建高亮器?
/* * 在这之前实际上要检索结果 Document 对象已经构建出来了。也就是说检索已经出来结果了。 * 但是出来的结果并没有加上高亮效果,也就是前缀后缀还没有加上去。 * 于是 Highlighter 要在查询出的结果数据再一次分词,然后检索关键字,再给关键字前后附上指定的前缀后缀 * -- 这些信息在构建 Highlighter 时必须提供 * getBestFragment 方法返回其内部加完高亮后的文本。然后程序员手动替换掉 Docoument 中原来的值。 * 我在想能不能弄一个 HighlightFormater 出来,接收一个 Document 参数,高亮后再返回出来不省事么? * 或者提供一个重装后支持高亮的 Document 对象。 */ String text = highlighter.getBestFragment(analyzer, "content", doc.get("content")); if (text != null) { doc.getField("content").setValue(text); // 使用高亮后的文本替换原始内容 }
4. 使用高亮器进行高亮操作
这个 API 设计得觉得不怎么好,比较绕。暴露出来了一些程序员比较容易犯错的东西。
/* * 在这之前实际上要检索结果 Document 对象已经构建出来了。也就是说检索已经出来结果了。 * 但是出来的结果并没有加上高亮效果,也就是前缀后缀还没有加上去。 * 于是 Highlighter 要在查询出的结果数据再一次分词,然后检索关键字,再给关键字前后附上指定的前缀后缀 * -- 这些信息在构建 Highlighter 时必须提供 * getBestFragment 方法返回其内部加完高亮后的文本。然后程序员手动替换掉 Docoument 中原来的值。 * 我在想能不能弄一个 HighlightFormater 出来,接收一个 Document 参数,高亮后再返回出来不省事么? * 或者提供一个重装后支持高亮的 Document 对象。 */ String text = highlighter.getBestFragment(analyzer, "content", doc.get("content")); if (text != null) { doc.getField("content").setValue(text); // 使用高亮后的文本替换原始内容 }
5 测试代码
public class HighlighterTest { /* IKAnalyzer 是一个支持Lucene3.0 API 的中文分词器 */ private static Analyzer analyzer = new IKAnalyzer(); /** * 搜索的数据是使用的 ArticleIndexDaoTest 中的保存操作的数据。 * 因此,代码中出现的 "content" 实际上是保存的时候,给 Document 添加的一个 Field * 保存代码在《Lucene-索引库的CRUD API 演示》中有 */ @Test public void test() throws Exception { // 搜索条件 String queryString = "lucene"; // ================================================================= // a, 把搜索字符串转为Query对象 QueryParser queryParser = new QueryParser(Version.LUCENE_30, "content", analyzer); Query query = queryParser.parse(queryString); // b, 搜索,得到中间结果 IndexSearcher indexSearcher = new IndexSearcher(Configuration.getDirectory()); TopDocs topDocs = indexSearcher.search(query, 100); // 返回前100条结果 ScoreDoc[] scoreDocs = topDocs.scoreDocs; // 前n条记录的信息 // -------------------------------------------- // 一、创建并配置高亮器 Formatter formater = new SimpleHTMLFormatter("<font color='red'>", "</font>"); // 高亮效果,默认为<B>与</B> Scorer scorer = new QueryScorer(query); // 查询条件 Highlighter highlighter = new Highlighter(formater, scorer); highlighter.setTextFragmenter(new SimpleFragmenter(20)); // 摘要的大小,默认为100个字符 // -------------------------------------------- // c, 处理结果 List<Article> list = new ArrayList<Article>(); for (int i = 0; i < scoreDocs.length; i++) { ScoreDoc scoreDoc = scoreDocs[i]; // 1,获得一个文档的信息 Document doc = indexSearcher.doc(scoreDoc.doc); // 2,根据文档编号取出相应的Document // -------------------------------------------- // 二、使用高亮器进行高亮操作 // 返回高亮后的(关键词出现次数最多的地方的)一段文本,如果当前高亮的属性中没有出搜索的关键词,则返回null String text = highlighter.getBestFragment(analyzer, "content", doc.get("content")); if (text != null) { doc.getField("content").setValue(text); // 使用高亮后的文本替换原始内容 } // -------------------------------------------- list.add(ArticleDocumentUtils.document2Article(doc));// 3,把Document转为Article } // ================================================================= // 显示结果 for (Article article : list) { System.out.println("-------> id = " + article.getId()); System.out.println("title = " + article.getTitle()); System.out.println("content = " + article.getContent()); } } }
本文实例为大家分享了vue elementUI表格关键字筛选高亮的具体代码,供大家参考,具体内容如下。<el-input type="search" v-model="search" style="w