- 浏览: 241971 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
sweed0:
为何每一段代码都重复一次呢?
spring注解实例二 -
Gary_Huangpf:
- - 插件报错啊
Ext前台分页 -
ddvk2007:
版主 我想請問你所說的mapreduce是hadoop的還是g ...
MapReduce中的Shuffle和Sort分析 -
人可木:
好问章,楼主写的相当详细。。。多谢。。。
findbugs插件的安装与应用 -
hautbbs:
按照博主的方法启动调试出现jvm terminated.Ex ...
10分钟学会使用MyEclipse断点调试js
solrj之二次开发
- 博客分类:
- 搜索引擎(lucene/solr)
Solrj已经是很强大的solr客户端了。它本身就包装了httpCliet,以完全对象的方式对solr进行交互。很小很好很强大。下面直接上自己封装的主要代码:
1、solrj操作接口
public interface SolrjQuery {
// solrj查询返回SolrDocument记录的集合
public DataGrid<SolrDocumentList> querySolrResult(String word, SolrSearchBasePO sbpo);
// solrj查询返回Map记录的集合
public DataGrid<List<Map<String,Object>>> querySolrResultForMap(String word, SolrSearchBasePO sbpo);
// solrj查询返回bean记录的集合
public <T> DataGrid<List<T>> querySolrResultForBO(String word, SolrSearchBasePO sbpo ,Class<T> clazz);
// 获取分组统计结果
public Map<String, Map<String, Long>> querySolrResultForFacet(String word, SolrSearchBasePO sbpo);
}
2、solr默认查询实现类
public class DefaultSolrjQuery implements SolrjQuery {
/**
* <获取查询结果,返回SolrDocument记录的集合>
* <功能详细描述>
*
* @param word
* @param sbpo
* @return DataGrid<List<Map<String,Object>>>
*/
public DataGrid<SolrDocumentList> querySolrResult(String word, SolrSearchBasePO sbpo) {
DataGrid<SolrDocumentList> dataGrid = new DataGrid<SolrDocumentList>();
// 建立solrQuery对象
SolrQuery query = new SolrQuery();
// 设置组装好的查询语句
query.setQuery(word);
// 从多少条开始
query.setStart(sbpo.getOffset());
// 每页显示多少行
query.setRows(sbpo.getLimit());
// 设置特殊属性,包含要返回的字段、排序、高亮
SolrjCommonUtil.SetSpecialProperties(query, sbpo);
CommonsHttpSolrServer httpSolrServer = SolrServer.getInstance().getServer();
try {
System.out.println("query : "+query);
QueryResponse rsp = httpSolrServer.query(query);
//得到所有的documents(数据)
SolrDocumentList docs = rsp.getResults();
// 如果启用了高亮,则将高亮后的数据填充doc
if(sbpo.getIs_hl()){
SolrjCommonUtil.SetHighlightData(rsp, docs, sbpo);
}
dataGrid.setData(docs);
System.out.println("count : "+(int)docs.getNumFound());
dataGrid.setTotalElements((int)docs.getNumFound());
} catch (SolrServerException e) {
e.printStackTrace();
}
return dataGrid;
}
/**
* <获取查询结果,并将SolrDocument格式转化为Map格式输出>
* <功能详细描述>
*
* @param word
* @param sbpo
* @return DataGrid<List<Map<String,Object>>>
*/
public DataGrid<List<Map<String,Object>>> querySolrResultForMap(String word, SolrSearchBasePO sbpo) {
// 获取查询结果SolrDocumentList
DataGrid<SolrDocumentList> jsonDataGrid = querySolrResult(word, sbpo);
// 将SolrDocument格式数据转化为Map格式输出
List<Map<String,Object>> dataList = SolrjCommonUtil.SolrDocumentConvertToMap(jsonDataGrid.getData());
DataGrid<List<Map<String,Object>>> listDataGrid = new DataGrid<List<Map<String,Object>>>();
listDataGrid.setData(dataList);
listDataGrid.setTotalElements(jsonDataGrid.getTotalElements());
return listDataGrid;
}
/**
* <获取查询结果,并将json格式转化为bean对象输出>
* <功能详细描述>
*
* @param word
* @param sbpo
* @param clazz
* @return DataGrid<List<T>>
*/
public <T> DataGrid<List<T>> querySolrResultForBO(String word, SolrSearchBasePO sbpo ,Class<T> clazz) {
DataGrid<List<T>> dataGrid = new DataGrid<List<T>>();
// 建立solrQuery对象
SolrQuery query = new SolrQuery();
// 设置组装好的查询语句
query.setQuery(word);
// 从多少条开始
query.setStart(sbpo.getOffset());
// 每页显示多少行
query.setRows(sbpo.getLimit());
// 设置特殊属性,包含要返回的字段、排序、高亮
SolrjCommonUtil.SetSpecialProperties(query, sbpo);
CommonsHttpSolrServer httpSolrServer = SolrServer.getInstance().getServer();
try {
System.out.println("query : "+query);
QueryResponse rsp = httpSolrServer.query(query);
List<T> beanList = new ArrayList<T>();
// 根据是否要高亮字段来执行操作,如果不需要高亮,则直接调用solrj中得getBeans得到bean记录集合
if(sbpo.getIs_hl()){
//得到所有的documents(数据)
SolrDocumentList docs = rsp.getResults();
// 如果启用了高亮,则将高亮后的数据填充doc
SolrjCommonUtil.SetHighlightData(rsp, docs, sbpo);
beanList = httpSolrServer.getBinder().getBeans(clazz,docs);
System.out.println("count : "+(int)docs.getNumFound());
dataGrid.setTotalElements((int)docs.getNumFound());
}else {
beanList = rsp.getBeans(clazz);
System.out.println("count : "+beanList.size());
dataGrid.setTotalElements(beanList.size());
}
dataGrid.setData(beanList);
} catch (SolrServerException e) {
e.printStackTrace();
}
return dataGrid;
}
/**
* <获取分组统计结果>
* <功能详细描述>
*
* @param word
* @param sbpo
* @return Map<String, Map<String, Long>>
*/
public Map<String, Map<String, Long>> querySolrResultForFacet(String word, SolrSearchBasePO sbpo) {
Map<String, Map<String, Long>> facetCountMap = new HashMap<String, Map<String, Long>>();
Map<String, Long> countMap = new HashMap<String, Long>();
// 建立solrQuery对象
SolrQuery query = new SolrQuery();
// 设置组装好的查询语句
query.setQuery(word);
// 设置特殊属性,包含要返回的字段、排序、高亮
SolrjCommonUtil.SetFacet(query, sbpo);
CommonsHttpSolrServer httpSolrServer = SolrServer.getInstance().getServer();
try {
System.out.println("query : "+query);
QueryResponse rsp = httpSolrServer.query(query);
List<FacetField> facets = rsp.getFacetFields();
if (null != facets) {
for (FacetField facet : facets) {
String facetFiled = facet.getName();
List<Count> counts = facet.getValues();
for (Count count : counts) {
countMap.put(count.getName(), count.getCount());
}
facetCountMap.put(facetFiled, countMap);
}
}
} catch (SolrServerException e) {
e.printStackTrace();
}
return facetCountMap;
}
3、solrj公共方法封装类
public class SolrjCommonUtil {
/**
* <设置特殊属性,包含要返回的字段、排序、高亮>
* <注意减少searching过程中不必要的component执行过程,提高效率>
* @param query
* @param sbpo [参数说明]
*
* @return void [返回类型说明]
* @exception throws [违例类型] [违例说明]
* @see [类、类#方法、类#成员]
*/
public static void SetSpecialProperties(SolrQuery query, SolrSearchBasePO sbpo){
// 设置要返回的字段
query.setParam("fl", sbpo.getFl());
// 设置排序字段
Iterator<String> orderIt = sbpo.getOrderMap().keySet().iterator();
while (orderIt.hasNext()) {
String order_field = orderIt.next();
query.setSortField(order_field, sbpo.getOrderParam(order_field));
}
// 做如下判断主要是为了减少searching过程中不必要的component执行过程
if (sbpo.getIs_hl()) {
// 设置是否高亮以及高亮字段,如果未设置前后缀,solr默认加上<em></em>
query.setHighlightSimplePre("<font color=\"red\">"); //标记,高亮关键字前缀
query.setHighlightSimplePost("</font>"); //后缀
query.setParam("hl", sbpo.getIs_hl());
query.setParam("hl.fl", sbpo.getHl_fl());
}
}
/**
* <设置分组属性>
* <功能详细描述>
* @param query
* @param sbpo [参数说明]
*
* @return void [返回类型说明]
* @exception throws [违例类型] [违例说明]
* @see [类、类#方法、类#成员]
*/
public static void SetFacet(SolrQuery query, SolrSearchBasePO sbpo){
// 做如下判断主要是为了减少searching过程中不必要的component执行过程
if (sbpo.getIs_facet()) {
// 设置排序字段
Iterator<String> facetIt = sbpo.getFacetParamList().iterator();
while (facetIt.hasNext()) {
query.addFacetField(facetIt.next());
}
}
// 设置返回结果>=1的记录
query.setFacetMinCount(1);
}
/**
* <将高亮后的数据填充doc>
* <功能详细描述>
* @param query
* @param sbpo [参数说明]
*
* @return void [返回类型说明]
* @exception throws [违例类型] [违例说明]
* @see [类、类#方法、类#成员]
*/
public static void SetHighlightData(QueryResponse rsp, SolrDocumentList docs, SolrSearchBasePO sbpo){
// 循环SolrDocumentList的值
for (SolrDocument solrDocument : docs) {
// 取出每条记录的唯一标识id
String id=(String) solrDocument.getFieldValue("id");
if (StringHelper.isNotNullAndEmpty(rsp.getHighlighting())) {
// 如果高亮字段不为空,则循环高亮字段并将高亮后的数据填充到doc该字段中
if (StringHelper.isNotNullAndEmpty(sbpo.getHl_fl())) {
String[] hl_fl = sbpo.getHl_fl().split(",");
List<String> highlightFieldValue = null;
for (int i = 0; i < hl_fl.length; i++) {
highlightFieldValue = rsp.getHighlighting().get(id).get(hl_fl[i]);
solrDocument.setField(hl_fl[i], highlightFieldValue.get(0));
}
}
}
}
}
/**
* <将SolrDocument格式数据转化为Map格式输出>
* <功能详细描述>
* @param docs [参数说明]
*
* @return List<Map<String,Object>> [返回类型说明]
* @exception throws [违例类型] [违例说明]
* @see [类、类#方法、类#成员]
*/
public static List<Map<String,Object>> SolrDocumentConvertToMap(SolrDocumentList docs){
List<Map<String,Object>> dataList = new ArrayList<Map<String,Object>>();
// 循环SolrDocumentList的值
for (SolrDocument solrDocument : docs) {
Map<String, Object> dataMap = new HashMap<String, Object>();
for(Iterator<Map.Entry<String, Object>> it = solrDocument.iterator(); it.hasNext(); )
{
Map.Entry<String, Object> docMap = it.next();
dataMap.put(docMap.getKey(), docMap.getValue());
}
dataList.add(dataMap);
}
return dataList;
}
solrj的使用暂且记录在此......见笑了。
发表评论
-
solr服务器复制、服务器分发(shard)、Multicore(分片)配置,SolrJ的使用
2012-07-16 15:23 7244Solr服务器复制的配置 1,首先测试在本机上开启三个t ... -
Solr Replication(复制)是怎样工作的
2012-07-16 15:18 1083luence有一个 ... -
Solr Multicore 结合 Solr Distributed Searching 切分大索引来搜索
2012-07-13 17:58 916原文出处:http://blog.chenl ... -
solr学习资料收集
2012-07-13 17:57 1010学习新东西前,我一般都会先找些文章来看,整个原理呀 ... -
Searching过程详解
2012-07-11 11:41 10191.拦截请求,解析请求并构建相应的handler。 发送 ... -
solr的配置参数理解
2012-07-11 11:35 1012l dataDir参数 用于替换默认的索引数据目录(. ... -
DataImportHandler从数据库导入大量数据而内存溢出的问题
2012-07-11 11:33 1521Solr有个很方便的 ... -
Solr 3.5 + Tomcat7 + mmseg4j + 搜狗词库 -配置并运行
2012-07-11 11:22 1393这是我看到过的写的较好的一篇入门文章,个人觉得相对有些文章 ... -
SOLR搭建企业搜索平台
2012-05-24 18:34 1780一、SOLR搭建企业搜索平台--MultiCore Solr ... -
solr理论
2012-05-24 17:11 10241、 solr基础 因为 Solr 包装并扩展了 Luc ... -
solr中Schema.xml和solrconfig.xml分析
2012-05-24 17:09 1660一、字段配置(schema) schema.xml位于s ... -
solr部署
2012-05-21 18:45 9761,从官方网站下载solr:apache-solr-3 ... -
lucene检索运算符
2012-05-05 13:05 1110lucene检索运算符: 1. “:” 指定字段查指定值 ... -
当前几个主要的Lucene中文分词器的比较
2012-01-05 15:36 14681. 基本介绍: paoding :Lucene ... -
全文检索lucene的使用和优化
2012-01-05 15:35 16141 lucene简介 1.1 什么是lucene L ... -
关于几种中文分词的比对
2011-12-06 09:34 1493目前lucene自身提供的StandardAnalyze ... -
lucene 索引 原理
2011-12-06 09:33 780Lucene是一个高性能的java ... -
lucene中QueryParser操作符的疑惑
2011-11-25 16:15 853在测试Lucene搜索时,对于 AND 与 + 的区别研 ... -
lucene学习资料收集
2011-11-25 16:09 770由于公司用到lucene,现对看到过的帮助较大的luce ... -
利用 Heritrix 构建特定站点爬虫
2011-11-25 15:41 831本文由浅入深,详细介绍了 Heritrix 在 Ecl ...
相关推荐
Solr4.3+Tomcat安装配置及二次开发使用说明 详细介绍各种solrj
solrj工具类封装,包括条件批量查询,批量增删改,分段修改。
放了SolrJ6.3.0所有web工程下的Jar包。solr-solrj6.3.0.jar等。放了SolrJ6.3.0所有web工程下的Jar包。放了SolrJ6.3.0所有web工程下的Jar包。
solr-solrj 5.0.0 和自己搭建的solr服务交互
solr-solrj-4.9.0.jar
压缩文件里面有solr-solrj-4.10.3.jar和solr-solrj-5.0.0.jar两个jar
solrj使用教程
solr-solrj-4.10.3.jar。
solrj的facet查询总结
Solrj 中文教程
下载后会获得名为:solr_core.4.6.0 的zip包,解压后会获得solr-core-4.6.0.jar和 solr-solrj-4.6.0.jar两个文件,搭建solr全文检索环境必须要添加的包
java大数据开发中solrJ所需要的核心包.................
solr-solrj-4.4.0.jar
solr-solrj-6.6.0.jar
solr部署在tomcat势必要设置用户权限,所以客户端solrj在创建连接的时候也需要用户名加密码
solrJ是Java连接solr进行查询检索和索引更新维护的jar包。
solr详细配置教程与solrj的使用
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文
Solr是一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口。...Solrj 是访问 Solr 的 Java 客户端,它提供添加、更新和查询Solr 索引的接口。http://wiki.chenlb.com/solr/doku.php?id=solrj
该文档主要是对solr1.4的配置,包含服务器的复制,分发,和分片