淘淘商城第54讲——商品搜索之service层开发

首先我们在taotao-search-interface工程的SearchService接口中声明一个根据搜索条件去查询搜索结果的方法,如下图所示。
淘淘商城第54讲——商品搜索之service层开发_第1张图片
然后我们在taotao-search-service工程的SearchServiceImpl实现类中去实现以上接口的方法,如下图所示。
淘淘商城第54讲——商品搜索之service层开发_第2张图片
为方便大家复制,现将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文件中暴露搜索接口,如下图所示。
淘淘商城第54讲——商品搜索之service层开发_第3张图片
由于前面在实现导入商品数据到索引库这一功能时,已经发布过了服务,所以在这儿不必再重新发布了,你只须看看你的配置是不是这样的就行。

至此,实现商品搜索功能的service层代码便写完了。

你可能感兴趣的:(阿昀的淘淘商城系列,项目实战之淘淘商城)