Lucene针对高亮显示功能提供了两种实现方式,分别是Highlighter和FastVectorHighlighter

这里的三个示例都是使用Highlighter;

示例代码:

  1. package com.tan.code;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.io.StringReader;
  5. import org.apache.lucene.analysis.TokenStream;
  6. import org.apache.lucene.analysis.core.SimpleAnalyzer;
  7. import org.apache.lucene.document.Document;
  8. import org.apache.lucene.index.DirectoryReader;
  9. import org.apache.lucene.index.IndexReader;
  10. import org.apache.lucene.index.Term;
  11. import org.apache.lucene.queryparser.classic.ParseException;
  12. import org.apache.lucene.queryparser.classic.QueryParser;
  13. import org.apache.lucene.search.IndexSearcher;
  14. import org.apache.lucene.search.Query;
  15. import org.apache.lucene.search.ScoreDoc;
  16. import org.apache.lucene.search.TermQuery;
  17. import org.apache.lucene.search.TopDocs;
  18. import org.apache.lucene.search.highlight.Highlighter;
  19. import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
  20. import org.apache.lucene.search.highlight.QueryScorer;
  21. import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
  22. import org.apache.lucene.search.highlight.SimpleSpanFragmenter;
  23. import org.apache.lucene.search.highlight.TokenSources;
  24. import org.apache.lucene.store.Directory;
  25. import org.apache.lucene.store.SimpleFSDirectory;
  26. import org.apache.lucene.util.Version;
  27. import org.wltea.analyzer.lucene.IKAnalyzer;
  28. public class HighlighterTest {
  29. // 高亮處理文本(以下内容纯属虚构)
  30. private String text = "China has lots of people,most of them are very poor.China is very big.China become strong now,but the poor people is also poor than other controry";
  31. // 原文高亮
  32. public void highlighter() throws IOException, InvalidTokenOffsetsException {
  33. TermQuery termQuery = new TermQuery(new Term("field", "china"));
  34. TokenStream tokenStream = new SimpleAnalyzer(Version.LUCENE_43)
  35. .tokenStream("field", new StringReader(text));
  36. QueryScorer queryScorer = new QueryScorer(termQuery);
  37. Highlighter highlighter = new Highlighter(queryScorer);
  38. highlighter.setTextFragmenter(new SimpleSpanFragmenter(queryScorer));
  39. System.out.println(highlighter.getBestFragment(tokenStream, text));
  40. }
  41. // 使用CSS進行高亮顯示處理
  42. public void highlighter_CSS(String searchText) throws ParseException,
  43. IOException, InvalidTokenOffsetsException {
  44. // 創建查詢
  45. QueryParser queryParser = new QueryParser(Version.LUCENE_43, "field",
  46. new SimpleAnalyzer(Version.LUCENE_43));
  47. Query query = queryParser.parse(searchText);
  48. // 自定义标注高亮文本标签
  49. SimpleHTMLFormatter htmlFormatter = new SimpleHTMLFormatter(
  50. "<span style=\"backgroud:red\">", "</span>");
  51. // 语汇单元化
  52. TokenStream tokenStream = new SimpleAnalyzer(Version.LUCENE_43)
  53. .tokenStream("field", new StringReader(text));
  54. // 創建QueryScoer
  55. QueryScorer queryScorer = new QueryScorer(query, "field");
  56. Highlighter highlighter = new Highlighter(htmlFormatter, queryScorer);
  57. highlighter.setTextFragmenter(new SimpleSpanFragmenter(queryScorer));
  58. System.out.println(highlighter.getBestFragments(tokenStream, text, 4,
  59. "..."));
  60. }
  61. // 高亮顯示搜索結果
  62. public void highlighter_SR(String field, String searchText)
  63. throws IOException, ParseException, InvalidTokenOffsetsException {
  64. //本次示例为了简便直接使用之前实验建立的索引
  65. Directory directory = new SimpleFSDirectory(new File("E://MyIndex"));
  66. IndexReader reader = DirectoryReader.open(directory);// 读取目录
  67. IndexSearcher search = new IndexSearcher(reader);// 初始化查询组件
  68. QueryParser parser = new QueryParser(Version.LUCENE_43, field,
  69. new IKAnalyzer(true));
  70. Query query = parser.parse(searchText);
  71. TopDocs td = search.search(query, 10000);// 获取匹配上元素的一个docid
  72. ScoreDoc[] sd = td.scoreDocs;// 加载所有的Documnet文档
  73. System.out.println("本次命中数据:" + sd.length);
  74. QueryScorer scorer = new QueryScorer(query, "content");
  75. Highlighter highlighter = new Highlighter(scorer);
  76. highlighter.setTextFragmenter(new SimpleSpanFragmenter(scorer));
  77. for (ScoreDoc scoreDoc : sd) {
  78. Document document = search.doc(scoreDoc.doc);
  79. String content = document.get("content");
  80. TokenStream tokenStream = TokenSources.getAnyTokenStream(
  81. search.getIndexReader(), scoreDoc.doc, "content", document,
  82. new IKAnalyzer(true));
  83. System.out.println(highlighter
  84. .getBestFragment(tokenStream, content));
  85. }
  86. }
  87. }

测试代码:

  1. @Test
  2. public void test() throws IOException, InvalidTokenOffsetsException,
  3. ParseException {
  4. // fail("Not yet implemented");
  5. HighlighterTest highlighterTest = new HighlighterTest();
  6. highlighterTest.highlighter();
  7. highlighterTest.highlighter_CSS("china");
  8. highlighterTest.highlighter_CSS("poor");
  9. highlighterTest.highlighter_SR("content", "床前明月光");
  10. }

测试结果:

  1. <B>China</B> has lots of people,most of them are very poor。<B>China</B> is very big.<B>China</B> become strong now,but the poor people is also poor than other controry
  2. <span style="backgroud:red">China</span> has lots of people,most of them are very poor。<span style="backgroud:red">China</span> is very big.<span style="backgroud:red">China</span> become strong now,but the poor people is also poor than other controry
  3. China has lots of people,most of them are very <span style="backgroud:red">poor</span>。China is very big.China become strong now,but the <span style="backgroud:red">poor</span> people is also <span style="backgroud:red">poor</span> than other controry
  4. 本次命中数据:1
  5. <B>床</B><B>前</B><B>明月光</B>,疑是地上霜

【Lucene】三个高亮显示模块的简单示例-Highlighter的更多相关文章

  1. 【Redis】三、Redis安装及简单示例

    (四)Redis安装及使用   Redis的安装比较简单,仍然和大多数的Apache开源软件一样,只需要下载,解压,配置环境变量即可.具体安装过程参考:菜鸟教程Redis安装.   安装完成后,通过r ...

  2. Python(2.7.6) 标准日志模块的简单示例

    Python 标准库中的 logging 模块提供了一套标准的 API 来处理日志信息的打印. import logging logging.basicConfig( level = logging. ...

  3. java中request,application,session三个域及参数简单示例

    直接上代码: java代码: public class HelloAction implements Action { @Override public String execute() throws ...

  4. lucene创建索引简单示例

    利用空闲时间写了一个使用lucene创建索引简单示例, 1.使用maven创建的项目 2.需要用到的jar如下: 废话不多说,直接贴代码如下: 1.创建索引的类(HelloLucene): packa ...

  5. 为Lua5.3编写C模块简单示例

    为Lua5.3编写C模块简单示例 一.编译安装Lua5.3 MSVC 命令行安装脚本: @echo off md bin md lib md include cd src cl /c /nologo ...

  6. SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 SignalR 简单示例 通过三个DEMO学会SignalR的三种实现方式 SignalR推送框架两个项目永久连接通讯使用 SignalR 集线器简单实例2 用SignalR创建实时永久长连接异步网络应用程序

    SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论   异常汇总:http://www ...

  7. pureMVC简单示例及其原理讲解三(View层)

    本篇说的是View层,即视图层,在本示例中包括两个部分:MXML文件,即可视控件:Mediator. 可视控件 可视控件由UserForm.mxml(图1)和UserList.mxml(图2)两个文件 ...

  8. 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)

    一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...

  9. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

随机推荐

  1. 遇到 HTTP 错误 403.14 - Forbidden?

    打开 http://localhost:1609 报错: HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容 解决方案一:设置默认首页 在 Web.conf ...

  2. 前端编码风格规范之 HTML 规范

    HTML 规范 文档类型 推荐使用 HTML5 的文档类型申明: <!DOCTYPE html>. (建议使用 text/html 格式的 HTML.避免使用 XHTML.XHTML 以及 ...

  3. MyCAT日志分析

    MyCAT日志对于了解MyCAT的运行信息不可获取,譬如MyCAT是否采用读写分离,对于一个查询语句,MyCAT是怎样执行的,每个分片会分发到哪个节点上等等. 默认是info级别,通过log4j.xm ...

  4. ASP.NET MVC Ajax.ActionLink 简单用法

    ASP.NET MVC 项目中,如何使用类似于 iframe 的效果呢?或者说 Ajax 局部刷新,比如下面操作: 我们想要的效果是,点击 About 链接,页面不刷新(地址栏不变),然后下面的内容进 ...

  5. [c++] Exceptions

    注意优先级关系,如下: try { throw logic_error{"blah"}; } catch (exception) { // caught here! // 有点if ...

  6. 1Z0-053 争议题目解析486

    1Z0-053 争议题目解析486 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 486.You execute the following Recovery Manager (R ...

  7. 1Z0-053 争议题目解析701

    1Z0-053 争议题目解析701 考试科目:1Z0-053 题库版本:V13.02 题库中原题为: 701.A user receives the following error while per ...

  8. jquery自定义滚动条 鼠标移入或滚轮时显示 鼠标离开或悬停超时时隐藏

    一.需求: 我需要做一个多媒体播放页面,左侧为播放列表,右侧为播放器.为了避免系统滚动条把列表和播放器隔断开,左侧列表的滚动条需要自定义,并且滚动停止和鼠标离开时要隐藏掉. 二.他山之石: 案例来自h ...

  9. DatePickerDialog、AutoCompleteTextView

    DatePickerDialog选择日期,调用showDialog(int id)方法,会执行onCreateDialog方法: @Override protected Dialog onCreate ...

  10. WebSocket 学习(三)--用nodejs搭建服务器

    前面已经学习了WebSocket API,包括事件.方法和属性.详情:WebSocket(二)--API  WebSocket是基于事件驱动,支持全双工通信.下面通过三个简单例子体验一下. 简单开始 ...