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的使用暂且记录在此......见笑了。

猜你喜欢

转载自huanglz19871030.iteye.com/blog/1584877