我们先来看下上节课我们一起学习的solrj查询测试代码,如下图所示,可以看到,代码的上半部分是比较灵活的,根据用户查询条件的不同而不同,但是红色圈住的那部分代码则是固定的,不论什么查询条件都要执行下面那段代码,因此我们可以考虑将下面那段代码封装起来,写到Dao层。
我们根据在公司的实际操作场景来写,在实际开发中一般都是要有接口和实现类的,因此我们在taotao-search-interface工程新建一个com.taotao.search.dao包,并在该包下新建一个接口类SearchDao,如下图所示。
我们在taotao-search-service工程添加一个com.taotao.search.dao.impl包并在该包下新建SearchDao的实现类SearchDaoImpl,如下图所示。
实现类代码如下:
package com.taotao.search.dao.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.taotao.common.pojo.SearchItem;
import com.taotao.common.pojo.SearchResult;
import com.taotao.search.dao.SearchDao;
@Repository
public class SearchDaoImpl implements SearchDao{
@Autowired
private SolrServer solrServer;
@Override
public SearchResult search(SolrQuery query) throws Exception {
//根据query对象进行查询
QueryResponse response = solrServer.query(query);
//取查询结果
SolrDocumentList solrDocumentList = response.getResults();
//取查询结果总记录数
long numFound = solrDocumentList.getNumFound();
//初始化一个SolrResult对象并把总数属性进行赋值
SearchResult searchResult = new SearchResult();
searchResult.setTotalNumber(numFound);
List<SearchItem> itemList = new ArrayList<>();
//把查询结果封装到SearchItem当中
for (SolrDocument solrDocument : solrDocumentList) {
SearchItem searchItem = new SearchItem();
searchItem.setId((String)solrDocument.get("id"));
searchItem.setImage((String)solrDocument.get("item_image"));
searchItem.setItem_category_name((String)solrDocument.get("item_category_name"));
searchItem.setItem_desc((String)solrDocument.get("item_desc"));
searchItem.setPrice((long)solrDocument.get("item_price"));
searchItem.setSell_point((String)solrDocument.get("item_sell_point"));
//取高亮显示
Map<String,Map<String,List<String>>> highlighting = response.getHighlighting();
List<String> list = highlighting.get(solrDocument.get("id")).get("item_title");
String title = "";
if(list != null && list.size() > 0){
title = list.get(0);
} else {
title = (String)solrDocument.get("item_title");
}
searchItem.setTitle(title);
itemList.add(searchItem);
}
//把结果添加到SearchResult当中
searchResult.setItemList(itemList);
//返回
return searchResult;
}
}
这样,我们的Dao层便写完了。