【Lucene3.6.2入门系列】第15节_SolrJ高亮
package com.jadyer.solrj; import java.util.ArrayList;
import java.util.List;
import java.util.Map; import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrInputDocument; /**
* 【Lucene3.6.2入门系列】第15节_SolrJ高亮
* @create Aug 20, 2013 1:50:38 PM
* @author 玄玉<http://blog.csdn.net/jadyer>
*/
public enum HelloSolrJHighLighter {
INSTANCE; private SolrServer server; private HelloSolrJHighLighter(){
//创建SolrServer对象,它有两个线程安全的子类EmbeddedSolrServer和CommonsHttpSolrServer
//EmbeddedSolrServer-----内嵌式的,不需要启动Web服务器
//CommonsHttpSolrServer--需要启动Web服务器,它是通过HTTP请求来获取数据的
//CommonsHttpSolrServer已不推荐直接使用了,而是推荐使用HttpSolrServer类
//同样的StreamingUpdateSolrServer也不推荐使用了,推荐使用ConcurrentUpdateSolrServer
server = new HttpSolrServer("http://127.0.0.1:8088/solr");
//添加索引
this.addIndex();
} /**
* 添加索引
* @see 这里之所以没有硬编码指定my_title和my_content的中文分词器
* @see 是由于schema.xml中在定义这俩<field>时已通过type属性指定了中文分词器
* @see 关于指定中文分词器的具体方法,详见http://blog.csdn.net/jadyer/article/details/10106011
*/
private void addIndex(){
try {
//添加之前先删除全部索引,删除完记得commit才能生效
server.deleteByQuery("*:*");
server.commit();
} catch (Exception e) {
e.printStackTrace();
}
List<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
for(int i=1; i<4; i++){
SolrInputDocument doc = new SolrInputDocument();
//对于Solr而言,默认的id是唯一的主键(如果我们没有自定义主键的话),当多次添加的时候,最后添加的相同id的域会覆盖已有的
doc.addField("id", Integer.toString(i));
//这里使用的是自定义的Field,所以就需要在schema.xml中为其添加<field>描述,并通过type属性指定其使用的分词器
doc.addField("my_title", "这是我的第" + i + "个SolrJ程序");
doc.addField("my_content", "my第" + i + "个SolrJ程序的运行情况");
docs.add(doc);
}
try {
//可以只添加一个Document,也可以一次添加多个Document,这里添加多个
server.add(docs);
//commit后方能生效,否则搜索到的还是add前的索引信息
server.commit();
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 搜索高亮
*/
public void testHighLighter(){
SolrQuery query = new SolrQuery("my_title:SolrJ");
query.setHighlight(true).setHighlightSimplePre("<span style='color:red'>").setHighlightSimplePost("</span>");
//设置高亮的区域,可设置多个区域(但有个前提-->待高亮的信息必须是被存储的,即schema.xml中配置<field store="true">)
query.setParam("hl.fl", "my_title, my_content");
QueryResponse resp = null;
try {
resp = server.query(query);
} catch (SolrServerException e) {
e.printStackTrace();
}
for(SolrDocument sd : resp.getResults()){
Map<String, List<String>> snippetMap = resp.getHighlighting().get(sd.getFieldValue("id"));
if(snippetMap!=null && !snippetMap.isEmpty()){
List<String> snippetList = snippetMap.get("my_title");
for(String snippet : snippetList){
System.out.print(snippet);
}
System.out.print(" ");
//注意,如果在配置<field my_content multiValued="true"/>时指定其支持多值域
//那么,此处获取到的就会是第一个值域的值
snippetList = snippetMap.get("my_content");
for(String snippet : snippetList){
System.out.println(snippet);
}
}
}
} /**
* 测试一下SolrJ的高亮效果
* @see 测试前记得启动Web服务器
* @see 关于Solr与Tomcat的整合,详见http://blog.csdn.net/jadyer/article/details/10104077
*/
public static void main(String[] args) {
HelloSolrJHighLighter.INSTANCE.testHighLighter();
}
}
【Lucene3.6.2入门系列】第15节_SolrJ高亮的更多相关文章
- 【Lucene3.6.2入门系列】第05节_自定义停用词分词器和同义词分词器
首先是用于显示分词信息的HelloCustomAnalyzer.java package com.jadyer.lucene; import java.io.IOException; import j ...
- 【Lucene3.6.2入门系列】第04节_中文分词器
package com.jadyer.lucene; import java.io.IOException; import java.io.StringReader; import org.apach ...
- 【Lucene3.6.2入门系列】第03节_简述Lucene中常见的搜索功能
package com.jadyer.lucene; import java.io.File; import java.io.IOException; import java.text.SimpleD ...
- 【Lucene3.6.2入门系列】第14节_SolrJ操作索引和搜索文档以及整合中文分词
package com.jadyer.solrj; import java.util.ArrayList; import java.util.List; import org.apache.solr. ...
- 【Lucene3.6.2入门系列】第10节_Tika
首先贴出来的是演示了借助Tika创建索引的HelloTikaIndex.java PS:关于Tika的介绍及用法,详见下方的HelloTika.java package com.jadyer.luce ...
- ABP入门系列(15)——创建微信公众号模块
ABP入门系列目录--学习Abp框架之实操演练 源码路径:Github-LearningMpaAbp 1. 引言 现在的互联网已不在仅仅局限于网页应用,IOS.Android.平板.智能家居等平台正如 ...
- Vue 2.0 入门系列(15)学习 Vue.js 需要掌握的 es6 (2)
类与模块 类 es6 之前,通常使用构造函数来创建对象 // 构造函数 User function User(username, email) { this.username = username; ...
- ABP入门系列目录——学习Abp框架之实操演练
ABP是"ASP.NET Boilerplate Project (ASP.NET样板项目)"的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WE ...
- 【168】ENVI入门系列
参考:ENVI-IDL中国的博客 [ENVI入门系列]01.ENVI产品简介与入门 [ENVI入门系列]02.自定义坐标系(北京54.西安80.2000坐标系) [ENVI入门系列]03.基于自带定位 ...
随机推荐
- ios开发中MVC模式的理解
MVC是80年代出现的一种软件设计模式,是模型(model),视图(view)和控制(Controller)的缩写. 其中Model的主要功能包括业务逻辑的处理以及数据的访问,这是应用程序的主体部分. ...
- Codevs 1081 线段树练习 2
1081 线段树练习 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 传送门 题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的 ...
- PAT_1008 数组元素循环右移问题
题目描述: 一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0A1……AN-1)变换为(AN-M …… AN ...
- MySQL 时间戳(Timestamp)函数
1. MySQL 获得当前时间戳函数:current_timestamp, current_timestamp() mysql> select current_timestamp, curren ...
- 24种设计模式--模版方法模式【Template Method Pattern】
周三,9:00,我刚刚坐到位置,打开电脑准备开始干活.“小三,小三,叫一下其它同事,到会议室,开会”老大跑过来吼,带着淫笑.还不等大家坐稳,老大就开讲了,“告诉大家一个好消息,昨天终于把牛叉模型公司的 ...
- js键盘控制div移动,解决停顿问题
问题版本代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 <html> &l ...
- Install-Package 那点事儿
为了练习使用SignaR,新建了一个.net 4.0的MVC4项目, 第一步,不用说就是先将SignaR安装到项目中,考虑到SignaR 目前已经更新到2.0 并且无法在 4.0框架下面使用,此时通过 ...
- html5时间选择器
HTML5日期输入类型(date) 分享 分享 分享 分享 分享 在很多页面和web应用中都有输入日期和时间的地方,最典型的是订飞机票,火车票,酒店,批萨等网站. 在HTML5之前 ...
- PHP代码分离
所谓的代码分离 其实只是一种思路,既然是一种思路 那就意味着他是有需求的 没有需求就没有解决方案 没有方案就不存在思路. 在这之前,我们制作 PHP 程序页面的时候.都是 HTML 和 PHP 混合写 ...
- Arduino从基础到实践第三章练习题
先写在这里,还没经过测试. 1. LED两端往中间移动,到中间后向两边返回. // adr301.ino , , , , , , , , , }; ); ; ; unsigned long chang ...