- 浏览: 47121 次
- 性别:
- 来自: 成都
最新评论
Solrj已经是很强大的solr客户端了。它本身就包装了httpCliet,以完全对象的方式对solr进行交互。很小很好很强大。
不过在实际使用中,设置SolrQuery 的过程中,为了设置多个搜索条件和排序规则等等参数,我们往往会陷入并接字符串的地步,实在是很丑陋,不符合面向对象的思想。扩展性几乎为0,。基于这点,开发了一个小东西,我们只需要设置搜索对象,将对象扔给后台就可以了。
比如,我们搭建的solr服务支持某10个字段的搜索,我们要搜索其中的一些,那么我们只需要传入要搜索的对象POJO,将要搜索的字段内容,set到POJO对象对应额字段即可。
比如如下一个类:
那么我们在定义搜索对象时候,就按照如下设置:
设置排序条件,也是类似的做法:
将定义好的两个对象扔给后面的接口就可以了。
接口函数querySolrResult传入四个参数,其中包含搜索字段对象,排序条件对象。为了提供类似limit的操作,用于分页查询,提供了startIndex和pageSize。
函数querySolrResultCount是单纯为了获得搜索条数,配合分页使用。
以下是定义的接口:
实现逻辑为,首先将传入的两个实体对象,解析为<K,V>结构的Map当中,将解析完成的Map放入solrj实际的搜索对象当中。返回的对象为solrj的API提供的SolrDocument,其中结果数量为直接返回SolrDocumentList对象的getNumFound()
具体实现类:
其中,对象的解析式利用反射原理,将实体对象中不为空的值,以映射的方式,转化为一个Map,其中排序对象在转化的过程中,使用TreeMap,保证其顺序性。
解析公共类实现如下:
整个实现是在Spring的基础上完成的,其中SolrjQuery的init()方法在Spring容器启动是初始化。Init()方法内的属性,也是直接注入的。上层与下层之间也完全用注入的方式解决。具体配置就不贴不出来了,大家都会。
整个代码很简陋,但是几乎支持了你想要搜索的条件设置,而且不会暴露任何与solr相关的内容给上层调用,使整个搜索几乎以sql语言的思想在设置条件。
不过在实际使用中,设置SolrQuery 的过程中,为了设置多个搜索条件和排序规则等等参数,我们往往会陷入并接字符串的地步,实在是很丑陋,不符合面向对象的思想。扩展性几乎为0,。基于这点,开发了一个小东西,我们只需要设置搜索对象,将对象扔给后台就可以了。
比如,我们搭建的solr服务支持某10个字段的搜索,我们要搜索其中的一些,那么我们只需要传入要搜索的对象POJO,将要搜索的字段内容,set到POJO对象对应额字段即可。
比如如下一个类:
package org.uppower.tnt.biz.core.manager.blog.dataobject; /** * @author yingmu * @version 2010-7-20 下午01:00:55 */ public class SolrPropertyDO { private String auction_id; private String opt_tag; private String exp_tag; private String title; private String desc; private String brand; private String category; private String price; private String add_prov; private String add_city; private String quality; private String flag; private String sales; private String sellerrate; private String selleruid; private String ipv15; public String getAuction_id() { return auction_id; } public void setAuction_id(String auctionId) { auction_id = auctionId; } …… public String getExp_tag() { return exp_tag; } public void setExp_tag(String expTag) { exp_tag = expTag; } }
那么我们在定义搜索对象时候,就按照如下设置:
SolrPropertyDO propertyDO = new SolrPropertyDO(); propertyDO.setAdd_city("(杭州AND成都)OR北京"); propertyDO.setTitle("丝绸OR剪刀"); ……
设置排序条件,也是类似的做法:
SolrPropertyDO compositorDO = new SolrPropertyDO(); compositorDO.setPrice ("desc"); compositorDO.setQuality ("asc"); ……
将定义好的两个对象扔给后面的接口就可以了。
接口函数querySolrResult传入四个参数,其中包含搜索字段对象,排序条件对象。为了提供类似limit的操作,用于分页查询,提供了startIndex和pageSize。
函数querySolrResultCount是单纯为了获得搜索条数,配合分页使用。
以下是定义的接口:
package org.uppower.tnt.biz.core.manager.blog; import java.util.List; import org.uppower.tnt.biz.core.manager.isearch.dataobject.SolrPropertyDO; /** * @author yingmu * @version 2010-7-20 下午03:51:15 */ public interface SolrjOperator { /** * 获得搜索结果 * * @param propertyDO * @param compositorDO * @param startIndex * @param pageSize * @return * @throws Exception */ public List<Object> querySolrResult(Object propertyDO, Object compositorDO, Long startIndex, Long pageSize) throws Exception; /** * 获得搜索结果条数 * * @param propertyDO * @param compositorDO * @return * @throws Exception */ public Long querySolrResultCount(SolrPropertyDO propertyDO, Object compositorDO) throws Exception; }
实现逻辑为,首先将传入的两个实体对象,解析为<K,V>结构的Map当中,将解析完成的Map放入solrj实际的搜索对象当中。返回的对象为solrj的API提供的SolrDocument,其中结果数量为直接返回SolrDocumentList对象的getNumFound()
具体实现类:
package org.uppower.tnt.biz.core.manager.blog; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; import org.apache.solr.common.SolrDocumentList; import org.uppower.tnt.biz.core.manager.isearch.common.SolrjCommonUtil; import org.uppower.tnt.biz.core.manager.isearch.dataobject.SolrPropertyDO; import org.uppower.tnt.biz.core.manager.isearch.solrj.SolrjQuery; /** * @author yingmu * @version 2010-7-20 下午03:51:15 */ public class DefaultSolrOperator implements SolrjOperator { private Logger logger = LoggerFactory.getLogger(this.getClass()); private SolrjQuery solrjQuery; public void setSolrjQuery(SolrjQuery solrjQuery) { this.solrjQuery = solrjQuery; } @Override public List<Object> querySolrResult(Object propertyDO, Object compositorDO, Long startIndex, Long pageSize) throws Exception { Map<String, String> propertyMap = new TreeMap<String, String>(); //排序有顺序,使用TreeMap Map<String, String> compositorMap = new TreeMap<String, String>(); try { propertyMap = SolrjCommonUtil.getSearchProperty(propertyDO); compositorMap = SolrjCommonUtil.getSearchProperty(compositorDO); } catch (Exception e) { logger.error("SolrjCommonUtil.getSearchProperty() is error !"+ e); } SolrDocumentList solrDocumentList = solrjQuery.query(propertyMap, compositorMap, startIndex, pageSize); List<Object> resultList = new ArrayList<Object>(); for (int i = 0; i < solrDocumentList.size(); i++) { resultList.add(solrDocumentList.get(i)); } return resultList; } @Override public Long querySolrResultCount(SolrPropertyDO propertyDO, Object compositorDO) throws Exception { Map<String, String> propertyMap = new TreeMap<String, String>(); Map<String, String> compositorMap = new TreeMap<String, String>(); try { propertyMap = SolrjCommonUtil.getSearchProperty(propertyDO); compositorMap = SolrjCommonUtil.getSearchProperty(compositorDO); } catch (Exception e) { logger.error("SolrjCommonUtil.getSearchProperty() is error !" + e); } SolrDocumentList solrDocument = solrjQuery.query(propertyMap, compositorMap, null, null); return solrDocument.getNumFound(); } }
其中,对象的解析式利用反射原理,将实体对象中不为空的值,以映射的方式,转化为一个Map,其中排序对象在转化的过程中,使用TreeMap,保证其顺序性。
解析公共类实现如下:
package org.uppower.tnt.biz.core.manager.blog.solrj; import java.net.MalformedURLException; import java.util.Map; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocumentList; /** * @author yingmu * @version 2010-7-20 下午02:57:04 */ public class SolrjQuery { private String url; private Integer soTimeOut; private Integer connectionTimeOut; private Integer maxConnectionsPerHost; private Integer maxTotalConnections; private Integer maxRetries; private CommonsHttpSolrServer solrServer = null; private final static String ASC = "asc"; public void init() throws MalformedURLException { solrServer = new CommonsHttpSolrServer(url); solrServer.setSoTimeout(soTimeOut); solrServer.setConnectionTimeout(connectionTimeOut); solrServer.setDefaultMaxConnectionsPerHost(maxConnectionsPerHost); solrServer.setMaxTotalConnections(maxTotalConnections); solrServer.setFollowRedirects(false); solrServer.setAllowCompression(true); solrServer.setMaxRetries(maxRetries); } public SolrDocumentList query(Map<String, String> propertyMap, Map<String, String> compositorMap, Long startIndex, Long pageSize) throws Exception { SolrQuery query = new SolrQuery(); // 设置搜索字段 if (null == propertyMap) { throw new Exception("搜索字段不可为空!"); } else { for (Object o : propertyMap.keySet()) { StringBuffer sb = new StringBuffer(); sb.append(o.toString()).append(":"); sb.append(propertyMap.get(o)); String queryString = addBlank2Expression(sb.toString()); query.setQuery(queryString); } } // 设置排序条件 if (null != compositorMap) { for (Object co : compositorMap.keySet()) { if (ASC == compositorMap.get(co) || ASC.equals(compositorMap.get(co))) { query.addSortField(co.toString(), SolrQuery.ORDER.asc); } else { query.addSortField(co.toString(), SolrQuery.ORDER.desc); } } } if (null != startIndex) { query.setStart(Integer.parseInt(String.valueOf(startIndex))); } if (null != pageSize && 0L != pageSize.longValue()) { query.setRows(Integer.parseInt(String.valueOf(pageSize))); } try { QueryResponse qrsp = solrServer.query(query); SolrDocumentList docs = qrsp.getResults(); return docs; } catch (Exception e) { throw new Exception(e); } } private String addBlank2Expression(String oldExpression) { String lastExpression; lastExpression = oldExpression.replace("AND", " AND ").replace("NOT", " NOT ").replace("OR", " OR "); return lastExpression; } public Integer getMaxRetries() { return maxRetries; } …… public void setMaxTotalConnections(Integer maxTotalConnections) { this.maxTotalConnections = maxTotalConnections; } }
整个实现是在Spring的基础上完成的,其中SolrjQuery的init()方法在Spring容器启动是初始化。Init()方法内的属性,也是直接注入的。上层与下层之间也完全用注入的方式解决。具体配置就不贴不出来了,大家都会。
整个代码很简陋,但是几乎支持了你想要搜索的条件设置,而且不会暴露任何与solr相关的内容给上层调用,使整个搜索几乎以sql语言的思想在设置条件。
发表评论
-
nutch-乱码解决(转)
2011-06-02 00:45 3423ubuntu下nutch-1.0的安装和配置错误排除(原创 ... -
nutch 抓取动态网页(转)
2011-06-02 00:38 1314解决搜索动态内容的问题: 需要注意在conf下面的2个文件:r ... -
Solr在TomCat下的使用 和 运行多个Solr (转)
2010-11-08 15:55 1322一、在Tomcat中安装运行Solr 下载Solr包,找到d ... -
(转)Solr笔记 Schema.xml和solrconfig.xml分析
2010-11-08 15:39 1542现在我们开始研究载入的数据部分(importing data) ... -
hibernate search和solr的企业级搜索
2010-11-08 15:02 4738[size=medium]最近刚忙完一个电影网站,其中的全文搜 ... -
solr的分布式部署
2010-11-03 20:30 2102需求: 实现SOLR主,辅服务器更新同步,每次客户端COMM ... -
在Tomcat中使用solr
2010-11-03 19:32 1182====== ====== ==== 单个 Solr ... -
solr技术文档
2010-11-03 19:25 1527pan_java 写道SOLR技术文档 1. 了解lucene ... -
Solr学习笔记
2010-10-30 16:13 1029准备: Tomcat版本:apache-tomcat-7.0. ...
相关推荐
solr详细配置教程与solrj的使用
本文档主要针对Solr的二次开发进行深入探讨,旨在帮助开发者了解如何在现有基础上进行定制化开发,以满足特定的业务需求。 首先,开发环境的准备至关重要。在进行Solr二次开发之前,你需要确保拥有正确的开发工具和...
solr-solrj-4.9.0.jar
主要讲解了 solr客户端如何调用带账号密码的solr服务器调用,实现添加索引和查询索引,以及分组查询
综上所述,SolrJ是Solr与Java应用程序之间的重要桥梁,它简化了开发过程并提高了效率。根据项目需求选择合适版本的SolrJ,能够确保与Solr服务器的无缝对接,充分利用Solr的强大功能。同时,随着Solr版本的迭代,...
二、SolrJ介绍 SolrJ是Solr的Java客户端库,用于与Solr服务器进行交互,包括创建、更新、删除索引和执行查询。在DEMO中,你会看到如何使用SolrJ连接到Solr服务器,创建`SolrServer`对象,以及如何使用`...
Solr是一款强大的全文检索服务器,而Solrj则是与之交互的Java API,使得开发人员能够轻松地在Java应用程序中集成Solr的功能。 标题"solr-solrj-6.1.0"表明我们关注的是Solrj的一个特定版本,即6.1.0。这个版本可能...
Solr-Solrj 5.0.0 是一个用于与Apache Solr进行交互的Java客户端库。在本文中,我们将深入探讨Solr-Solrj的使用、功能及其与自建Solr服务的集成,特别是涉及到中文分词的场景。 Apache Solr是一款流行的开源全文...
solr-solrj-4.4.0.jar
### Solr配置与SolrJ使用详解 #### 一、Solr基本安装与配置 **1. 下载Solr** - **步骤说明**: 从Apache官方镜像站点下载Solr 1.4.1版本。 - **操作详情**: 访问链接`http://apache.etoak.com/lucene/solr/`,...
SolrJ是Apache Solr官方提供的Java客户端库,它使得在Java应用程序中与Solr搜索引擎进行交互变得简单。这个压缩包文件包含了SolrJ运行所必需的一些关键库,包括JUnit测试框架、Commons IO和Commons Logging。接下来...
Solr是Apache软件基金会开发的一款开源全文搜索引擎,它基于Java平台,是Lucene的一个扩展,提供了更为方便和强大的搜索功能。在Solr 6.2.0版本中,这个强大的分布式搜索引擎引入了许多新特性和改进,使其在处理大...
solrJ是Java连接solr进行查询检索和索引更新维护的jar包。
solr-solrj-6.6.0.jar
在Windows或Linux环境下,Solr的搭建主要包括以下步骤:下载Solr二进制包,解压,配置Solr核心,启动Solr服务器,并通过Web界面管理索引和查询。 **Spring**: Spring是一个全面的Java企业级应用开发框架,它简化了...
docker配置solr登录密码文件,内含配置密码的文件 、web.xml的文件 ,详情可以去看我的博客,博客地址:https://blog.csdn.net/huyande123/article/details/97110784
【Solr4 二次开发文档】的概述 Solr4 是一个基于 Lucene Java 的开源搜索服务器,提供了丰富的搜索功能,如层面搜索、命中醒目显示和多种输出格式支持。其特点是易于集成到Web应用,拥有直观的HTTP管理界面,并具备...
apache-solr-solrj-3.5.0.jar
里面有非常详细的说明交你怎么使用solrj客户端来操作solrAPI