商品搜索
Dao
业务逻辑
1、根据Query对象进行查询
2、返回查询结果,包括List、查询结果的总记录数
@Repository
public class SearchDao {
@Autowired
private SolrServer solrServer;
public SearchResult search(SolrQuery query) throws Exception{
//根据query对象进行查询
QueryResponse response = solrServer.query(query);
//取查询结果
SolrDocumentList solrDocumentList = response.getResults();
//取查询结果总记录数
long numFound = solrDocumentList.getNumFound();
SearchResult result = new SearchResult();
result.setRecordCount(numFound);
List<SearchItem> itemList = new ArrayList<>();
//把查询结果封装到SearchItem对象中
for (SolrDocument solrDocument : solrDocumentList) {
SearchItem item = new SearchItem();
item.setCategory_name((String) solrDocument.get("item_category_name"));
item.setId((String) solrDocument.get("id"));
//取一张图片
String image = (String) solrDocument.get("item_image");
if (StringUtils.isNotBlank(image)) {
image = image.split(",")[0];
}
item.setImage(image);
item.setPrice((long) solrDocument.get("item_price"));
item.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");
}
item.setTitle(title);
//添加到商品列表
itemList.add(item);
}
//把结果添加到SearchResult中
result.setItemList(itemList);
//返回
return result;
}
}
Service
业务逻辑
1、创建一个SolrQuery对象
2、设置查询条件
3、设置分页条件
4、需要指定默认搜索域
5、设置高亮
6、执行查询,调用SearchDao。得到SearchResult
7、需要计算总页数
8、返回SearchResult
@Service
public class SearchServiceImpl implements SearchService {
@Autowired
private SearchDao searchDao;
@Override
public SearchResult search(String queryString, int page, int rows) throws Exception {
//根据查询条件拼装查询对象
//创建一个SolrQuery对象
SolrQuery query = new SolrQuery();
//设置查询条件
query.setQuery(queryString);
//设置分页条件
if (page < 1) page =1;
query.setStart((page - 1) * rows);
if (rows < 1) rows = 10;
query.setRows(rows);
//设置默认搜索域
query.set("df", "item_title");
//设置高亮显示
query.setHighlight(true);
query.addHighlightField("item_title");
query.setHighlightSimplePre("<font color='red'>");
query.setHighlightSimplePost("</font>");
//调用dao执行查询
SearchResult searchResult = searchDao.search(query);
//计算查询结果的总页数
long recordCount = searchResult.getRecordCount();
long pages = recordCount / rows;
if (recordCount % rows > 0) {
pages++;
}
searchResult.setTotalPages(pages);
//返回结果
return searchResult;
}
}
Controller
业务逻辑
1、接收参数
2、调用服务查询商品列表
3、把查询结果传递给页面,需要参数回显
@Controller
public class SearchController {
@Autowired
private SearchService searchService;
@Value("${SEARCH_RESULT_ROWS}")
private Integer SEARCH_RESULT_ROWS;
@RequestMapping("/search")
public String search(@RequestParam("q") String queryString, @RequestParam(defaultValue = "1") Integer page,
Model model) throws Exception {
// int a = 1/0;
// 调用服务执行查询
// 把查询条件进行转码,解决get乱码问题
queryString = new String(queryString.getBytes("iso8859-1"), "utf-8");
SearchResult searchResult = searchService.search(queryString, page, SEARCH_RESULT_ROWS);
// 把结果传递给页面
model.addAttribute("query", queryString);
model.addAttribute("totalPages", searchResult.getTotalPages());
model.addAttribute("itemList", searchResult.getItemList());
model.addAttribute("page", page);
// 返回逻辑视图
return "search";
}
}
如果,是Dubbo分布式服务
Service需要发布服务
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.taotao.search.service.SearchService" ref="searchServiceImpl" timeout="300000"/>
Web引用服务
<!-- 引用dubbo服务 -->
<dubbo:application name="taotao-search-web"/>
<dubbo:registry protocol="zookeeper" address="192.168.25.167:2181"/>
<dubbo:reference interface="com.taotao.search.service.SearchService" id="searchService" />