【Lucene】三个高亮显示模块的简单示例-Highlighter
Lucene针对高亮显示功能提供了两种实现方式,分别是Highlighter和FastVectorHighlighter
这里的三个示例都是使用Highlighter;
示例代码:
- package com.tan.code;
- import java.io.File;
- import java.io.IOException;
- import java.io.StringReader;
- import org.apache.lucene.analysis.TokenStream;
- import org.apache.lucene.analysis.core.SimpleAnalyzer;
- import org.apache.lucene.document.Document;
- import org.apache.lucene.index.DirectoryReader;
- import org.apache.lucene.index.IndexReader;
- import org.apache.lucene.index.Term;
- import org.apache.lucene.queryparser.classic.ParseException;
- import org.apache.lucene.queryparser.classic.QueryParser;
- import org.apache.lucene.search.IndexSearcher;
- import org.apache.lucene.search.Query;
- import org.apache.lucene.search.ScoreDoc;
- import org.apache.lucene.search.TermQuery;
- import org.apache.lucene.search.TopDocs;
- import org.apache.lucene.search.highlight.Highlighter;
- import org.apache.lucene.search.highlight.InvalidTokenOffsetsException;
- import org.apache.lucene.search.highlight.QueryScorer;
- import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
- import org.apache.lucene.search.highlight.SimpleSpanFragmenter;
- import org.apache.lucene.search.highlight.TokenSources;
- import org.apache.lucene.store.Directory;
- import org.apache.lucene.store.SimpleFSDirectory;
- import org.apache.lucene.util.Version;
- import org.wltea.analyzer.lucene.IKAnalyzer;
- public class HighlighterTest {
- // 高亮處理文本(以下内容纯属虚构)
- 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";
- // 原文高亮
- public void highlighter() throws IOException, InvalidTokenOffsetsException {
- TermQuery termQuery = new TermQuery(new Term("field", "china"));
- TokenStream tokenStream = new SimpleAnalyzer(Version.LUCENE_43)
- .tokenStream("field", new StringReader(text));
- QueryScorer queryScorer = new QueryScorer(termQuery);
- Highlighter highlighter = new Highlighter(queryScorer);
- highlighter.setTextFragmenter(new SimpleSpanFragmenter(queryScorer));
- System.out.println(highlighter.getBestFragment(tokenStream, text));
- }
- // 使用CSS進行高亮顯示處理
- public void highlighter_CSS(String searchText) throws ParseException,
- IOException, InvalidTokenOffsetsException {
- // 創建查詢
- QueryParser queryParser = new QueryParser(Version.LUCENE_43, "field",
- new SimpleAnalyzer(Version.LUCENE_43));
- Query query = queryParser.parse(searchText);
- // 自定义标注高亮文本标签
- SimpleHTMLFormatter htmlFormatter = new SimpleHTMLFormatter(
- "<span style=\"backgroud:red\">", "</span>");
- // 语汇单元化
- TokenStream tokenStream = new SimpleAnalyzer(Version.LUCENE_43)
- .tokenStream("field", new StringReader(text));
- // 創建QueryScoer
- QueryScorer queryScorer = new QueryScorer(query, "field");
- Highlighter highlighter = new Highlighter(htmlFormatter, queryScorer);
- highlighter.setTextFragmenter(new SimpleSpanFragmenter(queryScorer));
- System.out.println(highlighter.getBestFragments(tokenStream, text, 4,
- "..."));
- }
- // 高亮顯示搜索結果
- public void highlighter_SR(String field, String searchText)
- throws IOException, ParseException, InvalidTokenOffsetsException {
- //本次示例为了简便直接使用之前实验建立的索引
- Directory directory = new SimpleFSDirectory(new File("E://MyIndex"));
- IndexReader reader = DirectoryReader.open(directory);// 读取目录
- IndexSearcher search = new IndexSearcher(reader);// 初始化查询组件
- QueryParser parser = new QueryParser(Version.LUCENE_43, field,
- new IKAnalyzer(true));
- Query query = parser.parse(searchText);
- TopDocs td = search.search(query, 10000);// 获取匹配上元素的一个docid
- ScoreDoc[] sd = td.scoreDocs;// 加载所有的Documnet文档
- System.out.println("本次命中数据:" + sd.length);
- QueryScorer scorer = new QueryScorer(query, "content");
- Highlighter highlighter = new Highlighter(scorer);
- highlighter.setTextFragmenter(new SimpleSpanFragmenter(scorer));
- for (ScoreDoc scoreDoc : sd) {
- Document document = search.doc(scoreDoc.doc);
- String content = document.get("content");
- TokenStream tokenStream = TokenSources.getAnyTokenStream(
- search.getIndexReader(), scoreDoc.doc, "content", document,
- new IKAnalyzer(true));
- System.out.println(highlighter
- .getBestFragment(tokenStream, content));
- }
- }
- }
测试代码:
- @Test
- public void test() throws IOException, InvalidTokenOffsetsException,
- ParseException {
- // fail("Not yet implemented");
- HighlighterTest highlighterTest = new HighlighterTest();
- highlighterTest.highlighter();
- highlighterTest.highlighter_CSS("china");
- highlighterTest.highlighter_CSS("poor");
- highlighterTest.highlighter_SR("content", "床前明月光");
- }
测试结果:
- <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
- <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
- 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
- 本次命中数据:1
- <B>床</B><B>前</B><B>明月光</B>,疑是地上霜
【Lucene】三个高亮显示模块的简单示例-Highlighter的更多相关文章
- 【Redis】三、Redis安装及简单示例
(四)Redis安装及使用 Redis的安装比较简单,仍然和大多数的Apache开源软件一样,只需要下载,解压,配置环境变量即可.具体安装过程参考:菜鸟教程Redis安装. 安装完成后,通过r ...
- Python(2.7.6) 标准日志模块的简单示例
Python 标准库中的 logging 模块提供了一套标准的 API 来处理日志信息的打印. import logging logging.basicConfig( level = logging. ...
- java中request,application,session三个域及参数简单示例
直接上代码: java代码: public class HelloAction implements Action { @Override public String execute() throws ...
- lucene创建索引简单示例
利用空闲时间写了一个使用lucene创建索引简单示例, 1.使用maven创建的项目 2.需要用到的jar如下: 废话不多说,直接贴代码如下: 1.创建索引的类(HelloLucene): packa ...
- 为Lua5.3编写C模块简单示例
为Lua5.3编写C模块简单示例 一.编译安装Lua5.3 MSVC 命令行安装脚本: @echo off md bin md lib md include cd src cl /c /nologo ...
- 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 ...
- pureMVC简单示例及其原理讲解三(View层)
本篇说的是View层,即视图层,在本示例中包括两个部分:MXML文件,即可视控件:Mediator. 可视控件 可视控件由UserForm.mxml(图1)和UserList.mxml(图2)两个文件 ...
- 基于.NET CORE微服务框架 -surging的介绍和简单示例 (开源)
一.前言 至今为止编程开发已经11个年头,从 VB6.0,ASP时代到ASP.NET再到MVC, 从中见证了.NET技术发展,从无畏无知的懵懂少年,到现在的中年大叔,从中的酸甜苦辣也只有本人自知.随着 ...
- web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例
Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...
随机推荐
- Easyui datagrid 显示隐藏列
html: <div style="float: left; width: 1450px; height:auto; "> & ...
- ASP.NET Web API 创建帮助页
1. 安装 Microsoft.AspNet.WebApi.HelpPage 程序包 Install-Package Microsoft.AspNet.WebApi.HelpPage 2. 注册 Ar ...
- 条形码的应用三-----------从Excel文件中读取条形码
条形码的应用三------从Excel文件中读取条形码 介绍 上一篇文章,我向大家展示了生成多个条形码并存储到Excel文件中的一个方法.后来我又有了个想法:既然条码插入到excel中了,我可不可以从 ...
- 关于多字节、宽字节、WideCharToMultiByte和MultiByteToWideChar函数的详解
所谓的短字符,就是用8bit来表示的字符,典型的应用是ASCII码. 而宽字符,顾名思义,就是用16bit表示的字符,典型的有UNICODE. **************************** ...
- 一步一步开发Game服务器(二)登陆2
上一篇文章,讲解了简单的登陆情况.接下来我们继续讲解登陆模块. 在正常的游戏服务器情况下.在尚未登录前可以查看服务器大区情况,登陆后也可以查看服务器大区情况,然后选择大区服务器.进行登录操作. 这样的 ...
- 通过Redux源码学习基础概念一:简单例子入门
最近公司有个项目使用react+redux来做前端部分的实现,正好有机会学习一下redux,也和小伙伴们分享一下学习的经验. 首先声明一下,这篇文章讲的是Redux的基本概念和实现,不包括react- ...
- pushState、replaceState、onpopstate 实现Ajax页面的前进后退刷新
使用Ajax可以异步获取数据,可以更高效地渲染页面. 但也存在这一些问题: 再刷新页面,页面就会变成初始的状态 浏览器的前进后退功能无效 对搜索引擎的爬虫抓取不友好 1. 早前会使用浏览器的 hash ...
- HTTP2特性预览和抓包分析
背景 近年来,http网络请求量日益添加,以下是httparchive统计,从2012-11-01到2016-09-01的请求数量和传输大小的趋势图: 当前大部份客户端&服务端架构的应用程序, ...
- TypeError: invalid 'in' operand obj
尝试在程序去访问远程的Web API,它在运行时,出现异常: TypeError: invalid 'in' operand obj 由于从服务器返回的数据是json.当我们需要得到这些数据时,还得需 ...
- HighchartsNET快速图表控件-开源
前言: HighchartsNET快速图表控件,基于Highcharts的asp.net web控件.只需几行代码你就能快速生成一个图表. 从此不再担心图表复杂.简单几行代码就可以搞定,节省大量工作时 ...