首先我们在taotao-search-interface工程的SearchService接口中声明一个根据搜索条件去查询搜索结果的方法,如下图所示。
然后我们在taotao-search-service工程的SearchServiceImpl实现类中去实现以上接口的方法,如下图所示。
为方便大家复制,现将SearchServiceImpl实现类的代码贴出,如下所示。
package com.taotao.search.service.impl;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.taotao.common.pojo.SearchItem;
import com.taotao.common.pojo.SearchResult;
import com.taotao.common.pojo.TaotaoResult;
import com.taotao.search.dao.SearchDao;
import com.taotao.search.mapper.SearchItemMapper;
import com.taotao.search.service.SearchService;
@Service
public class SearchServiceImpl implements SearchService {
@Autowired
private SearchItemMapper mapper;
@Autowired
private SolrClient solrClient;
@Autowired
private SearchDao searchDao;
@Override
public TaotaoResult importAllSearchItems() throws Exception {
// 1. 注入Mapper
// 2. 调用Mapper的方法,查询出所有的商品数据
List<SearchItem> serarchItemList = mapper.getSerarchItemList();
// 3. 通过SolrJ将这些数据写入到索引库中
// 3.1 创建HttpSolrClient对象
// 3.2 创建SolrInputDocument对象,是为了将列表中的元素一个个放到索引库当中
for (SearchItem searchItem : serarchItemList) {
SolrInputDocument document = new SolrInputDocument();
document.setField("id", searchItem.getId().toString()); // 这里是字符串,所以需要转换
document.setField("item_title", searchItem.getTitle());
document.setField("item_sell_point", searchItem.getSell_point());
document.setField("item_price", searchItem.getPrice());
document.setField("item_image", searchItem.getImage());
document.setField("item_category_name", searchItem.getCategory_name());
document.setField("item_desc", searchItem.getItem_desc());
// 添加到索引库
solrClient.add(document);
}
// 提交
solrClient.commit();
return TaotaoResult.ok();
}
@Override
public SearchResult search(String queryString, Integer page, Integer rows) throws Exception {
// 1. 创建一个SolrQuery对象
SolrQuery query = new SolrQuery();
// 2. 设置主查询条件
if (StringUtils.isNotBlank(queryString)) {
query.setQuery(queryString);
} else {
query.setQuery("*:*");
}
// 2.1 设置分页查询参数(没有排序哟!)
if (page == null) {
page = 1;
}
if (rows == null) {
rows = 60;
}
query.setStart((page - 1) * rows); // (page - 1) * rows
query.setRows(rows);
// 2.2 设置默认搜索域
query.set("df", "item_keywords");
// 2.3 设置高亮显示
query.addHighlightField("item_title"); // 设置高亮显示的域
query.setHighlight(true);
query.setHighlightSimplePre("");
query.setHighlightSimplePost("");
// 3. 调用dao的方法,返回一个SearchResult对象(它里面只包含了总记录数和商品的列表)
SearchResult search = searchDao.search(query);
// 4. 设置SearchResult对象中pageCount属性的指,即设置总页数
Long pageCount = 0l;
pageCount = search.getRecordCount() / rows;
if (search.getRecordCount() % rows > 0) {
pageCount++;
}
search.setPageCount(pageCount);
// 5. 返回
return search;
}
}
编写完service层的代码之后,千万记得还要发布服务,即在taotao-search-service工程的applicationContext-service.xml文件中暴露搜索接口,如下图所示。
由于前面在实现导入商品数据到索引库这一功能时,已经发布过了服务,所以在这儿不必再重新发布了,你只须看看你的配置是不是这样的就行。
至此,实现商品搜索功能的service层代码便写完了。