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