`
huanglz19871030
  • 浏览: 248659 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

solrj之二次开发

 
阅读更多

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-solrj-6.1.0

    Solr是一款强大的全文检索服务器,而Solrj则是与之交互的Java API,使得开发人员能够轻松地在Java应用程序中集成Solr的功能。 标题"solr-solrj-6.1.0"表明我们关注的是Solrj的一个特定版本,即6.1.0。这个版本可能...

    solr-solrj-4.10.3.jar和solr-solrj-5.0.0.jar

    在实际开发中,SolrJ通过提供简单的Java接口,使得开发者可以方便地执行以下操作: 1. 创建和管理Solr核心(Collection)。 2. 向Solr服务器发送索引文档,支持单个和批量操作。 3. 执行各种查询,包括基本查询、...

    快速上手数据挖掘之solr搜索引擎高级教程(Solr集群、KI分词)第07讲 solrj之SolrBean 共6页.pptx

    【课程大纲】第01讲 solr5简介第02讲 solr5之Schema第03讲 solr5之Solrconfig第04讲 solr5单机安装与配置第05讲 solrj基础(一)第06讲 solrj基础(二)第07讲 solrj之SolrBean第08讲 solrj语法详解第09讲 Solrj之...

    快速上手数据挖掘之solr搜索引擎高级教程(Solr集群、KI分词)第09讲 Solrj之Multicore查询共7页.pptx

    【课程大纲】第01讲 solr5简介第02讲 solr5之Schema第03讲 solr5之Solrconfig第04讲 solr5单机安装与配置第05讲 solrj基础(一)第06讲 solrj基础(二)第07讲 solrj之SolrBean第08讲 solrj语法详解第09讲 Solrj之...

    solr-solrj 5.0.0 demo

    同时,这个版本可能也对错误处理和异常报告进行了优化,以提供更好的开发体验。 在与自建的Solr服务交互时,首先需要在项目中添加Solr-Solrj的依赖。这通常通过Maven或Gradle等构建工具完成。接着,创建`SolrServer...

    solrj工具类封装

    solrj工具类封装,包括条件批量查询,批量增删改,分段修改。

    solrj的使用

    SolrJ是Apache Solr官方提供的Java客户端库,它...总之,SolrJ是Java开发人员与Solr进行交互的强大工具,它简化了Solr操作并提供了丰富的功能。通过熟练掌握SolrJ,你可以更高效地构建和管理基于Solr的搜索解决方案。

    SolrJ6.3.0

    在使用 SolrJ 时,开发人员需要将这些库添加到项目的类路径中,以便能够调用 SolrJ 提供的各种类和方法。例如,可以通过 `SolrClient` 接口连接到 Solr 服务器,使用 `SolrInputDocument` 类来构建要索引的文档,...

    solrJ 需要的jar文件 (全)

    - 在SolrJ的开发或集成过程中,JUnit是必不可少的,因为它可以帮助开发者确保代码的正确性和稳定性。通过编写针对SolrJ功能的测试用例,开发者可以验证SolrJ的各种操作,如建立索引、查询、更新等是否按预期工作。 ...

    SolrJ需要的jar包

    SolrJ是Apache Solr官方提供的Java客户端库,它使得Java开发者能够轻松地与Solr搜索引擎进行通信,执行查询、索引文档等操作。SolrJ的使用是大数据环境中实现高效全文检索和数据分析的关键组件。在Java项目中,正确...

    solr配置和solrJ的使用

    #### 二、Solr服务器复制配置 **1. 配置多台Tomcat服务器** - **步骤说明**: 在同一台机器上配置多个Tomcat实例作为Solr服务器。 - **操作详情**: 本例中配置了三台Tomcat服务器,端口分别为80、9888和9008。每...

    快速上手数据挖掘之solr搜索引擎高级教程(Solr集群、KI分词)第06讲 solrj基础(二) 共6页.pptx

    【课程大纲】第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.9.0.jar

    solr-solrj-4.10.3.jar

    solr-solrj-4.10.3.jar。

    solrj使用教程

    SolrJ是Apache Solr官方提供的Java客户端库,它使得在Java应用程序中与Solr进行交互变得简单。这个“solrj使用教程”很可能是为了帮助开发者了解如何使用SolrJ来连接、查询和管理Solr索引。下面将详细介绍SolrJ的...

    solr-core-4.6.0.jar solr-solrj-4.6.0.jar

    下载后会获得名为:solr_core.4.6.0 的zip包,解压后会获得solr-core-4.6.0.jar和 solr-solrj-4.6.0.jar两个文件,搭建solr全文检索环境必须要添加的包

    solrJ所需要的核心包

    java大数据开发中solrJ所需要的核心包.................

    solr-solrj-4.4.0.jar

    solr-solrj-4.4.0.jar

    solr-solrj-6.6.0.jar

    solr-solrj-6.6.0.jar

    solrj创建连接工厂

    solr部署在tomcat势必要设置用户权限,所以客户端solrj在创建连接的时候也需要用户名加密码

Global site tag (gtag.js) - Google Analytics