- 浏览: 248659 次
- 性别:
- 来自: 深圳
-
文章分类
最新评论
-
sweed0:
为何每一段代码都重复一次呢?
spring注解实例二 -
Gary_Huangpf:
- - 插件报错啊
Ext前台分页 -
ddvk2007:
版主 我想請問你所說的mapreduce是hadoop的還是g ...
MapReduce中的Shuffle和Sort分析 -
人可木:
好问章,楼主写的相当详细。。。多谢。。。
findbugs插件的安装与应用 -
hautbbs:
按照博主的方法启动调试出现jvm terminated.Ex ...
10分钟学会使用MyEclipse断点调试js
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 7314Solr服务器复制的配置 1,首先测试在本机上开启三个t ... -
Solr Replication(复制)是怎样工作的
2012-07-16 15:18 1179luence有一个 ... -
Solr Multicore 结合 Solr Distributed Searching 切分大索引来搜索
2012-07-13 17:58 944原文出处:http://blog.chenl ... -
solr学习资料收集
2012-07-13 17:57 1048学习新东西前,我一般都会先找些文章来看,整个原理呀 ... -
Searching过程详解
2012-07-11 11:41 10811.拦截请求,解析请求并构建相应的handler。 发送 ... -
solr的配置参数理解
2012-07-11 11:35 1063l dataDir参数 用于替换默认的索引数据目录(. ... -
DataImportHandler从数据库导入大量数据而内存溢出的问题
2012-07-11 11:33 1602Solr有个很方便的 ... -
Solr 3.5 + Tomcat7 + mmseg4j + 搜狗词库 -配置并运行
2012-07-11 11:22 1480这是我看到过的写的较好的一篇入门文章,个人觉得相对有些文章 ... -
SOLR搭建企业搜索平台
2012-05-24 18:34 1814一、SOLR搭建企业搜索平台--MultiCore Solr ... -
solr理论
2012-05-24 17:11 10841、 solr基础 因为 Solr 包装并扩展了 Luc ... -
solr中Schema.xml和solrconfig.xml分析
2012-05-24 17:09 1701一、字段配置(schema) schema.xml位于s ... -
solr部署
2012-05-21 18:45 10101,从官方网站下载solr:apache-solr-3 ... -
lucene检索运算符
2012-05-05 13:05 1148lucene检索运算符: 1. “:” 指定字段查指定值 ... -
当前几个主要的Lucene中文分词器的比较
2012-01-05 15:36 14971. 基本介绍: paoding :Lucene ... -
全文检索lucene的使用和优化
2012-01-05 15:35 16641 lucene简介 1.1 什么是lucene L ... -
关于几种中文分词的比对
2011-12-06 09:34 1530目前lucene自身提供的StandardAnalyze ... -
lucene 索引 原理
2011-12-06 09:33 815Lucene是一个高性能的java ... -
lucene中QueryParser操作符的疑惑
2011-11-25 16:15 893在测试Lucene搜索时,对于 AND 与 + 的区别研 ... -
lucene学习资料收集
2011-11-25 16:09 817由于公司用到lucene,现对看到过的帮助较大的luce ... -
利用 Heritrix 构建特定站点爬虫
2011-11-25 15:41 866本文由浅入深,详细介绍了 Heritrix 在 Ecl ...
相关推荐
Solr是一款强大的全文检索服务器,而Solrj则是与之交互的Java API,使得开发人员能够轻松地在Java应用程序中集成Solr的功能。 标题"solr-solrj-6.1.0"表明我们关注的是Solrj的一个特定版本,即6.1.0。这个版本可能...
在实际开发中,SolrJ通过提供简单的Java接口,使得开发者可以方便地执行以下操作: 1. 创建和管理Solr核心(Collection)。 2. 向Solr服务器发送索引文档,支持单个和批量操作。 3. 执行各种查询,包括基本查询、...
【课程大纲】第01讲 solr5简介第02讲 solr5之Schema第03讲 solr5之Solrconfig第04讲 solr5单机安装与配置第05讲 solrj基础(一)第06讲 solrj基础(二)第07讲 solrj之SolrBean第08讲 solrj语法详解第09讲 Solrj之...
【课程大纲】第01讲 solr5简介第02讲 solr5之Schema第03讲 solr5之Solrconfig第04讲 solr5单机安装与配置第05讲 solrj基础(一)第06讲 solrj基础(二)第07讲 solrj之SolrBean第08讲 solrj语法详解第09讲 Solrj之...
同时,这个版本可能也对错误处理和异常报告进行了优化,以提供更好的开发体验。 在与自建的Solr服务交互时,首先需要在项目中添加Solr-Solrj的依赖。这通常通过Maven或Gradle等构建工具完成。接着,创建`SolrServer...
solrj工具类封装,包括条件批量查询,批量增删改,分段修改。
SolrJ是Apache Solr官方提供的Java客户端库,它...总之,SolrJ是Java开发人员与Solr进行交互的强大工具,它简化了Solr操作并提供了丰富的功能。通过熟练掌握SolrJ,你可以更高效地构建和管理基于Solr的搜索解决方案。
在使用 SolrJ 时,开发人员需要将这些库添加到项目的类路径中,以便能够调用 SolrJ 提供的各种类和方法。例如,可以通过 `SolrClient` 接口连接到 Solr 服务器,使用 `SolrInputDocument` 类来构建要索引的文档,...
- 在SolrJ的开发或集成过程中,JUnit是必不可少的,因为它可以帮助开发者确保代码的正确性和稳定性。通过编写针对SolrJ功能的测试用例,开发者可以验证SolrJ的各种操作,如建立索引、查询、更新等是否按预期工作。 ...
SolrJ是Apache Solr官方提供的Java客户端库,它使得Java开发者能够轻松地与Solr搜索引擎进行通信,执行查询、索引文档等操作。SolrJ的使用是大数据环境中实现高效全文检索和数据分析的关键组件。在Java项目中,正确...
#### 二、Solr服务器复制配置 **1. 配置多台Tomcat服务器** - **步骤说明**: 在同一台机器上配置多个Tomcat实例作为Solr服务器。 - **操作详情**: 本例中配置了三台Tomcat服务器,端口分别为80、9888和9008。每...
【课程大纲】第01讲 solr5简介第02讲 solr5之Schema第03讲 solr5之Solrconfig第04讲 solr5单机安装与配置第05讲 solrj基础(一)第06讲 solrj基础(二)第07讲 solrj之SolrBean第08讲 solrj语法详解第09讲 Solrj之...
solr-solrj-4.9.0.jar
solr-solrj-4.10.3.jar。
SolrJ是Apache Solr官方提供的Java客户端库,它使得在Java应用程序中与Solr进行交互变得简单。这个“solrj使用教程”很可能是为了帮助开发者了解如何使用SolrJ来连接、查询和管理Solr索引。下面将详细介绍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在创建连接的时候也需要用户名加密码