返回的结果:
1)商品列表
2)总页数
3)总记录数
使用jsp展示,返回逻辑视图。
商品列表使用:SearchItem表示。
需要把查询结果封装到一个pojo中:
1)商品列表List<SearchItem>
2)总页数。Int totalPages。总记录数/每页显示的记录数向上取整。把每页显示的记录是配置到属性文件中。
3)总记录数。Int recourdCount
一、dao层
创建dao
/**
* 商品搜索dao
*
*/
@Repository
public class SearchDao {
@Autowired
private SolrServer solrServer;
/**
* 根据查询条件查询索引库
*
* @param query
* @return
* @throws Exception
*/
public SearchResult search(SolrQuery query) throws Exception {
// 根据查询条件查询索引库
QueryResponse queryResponse = solrServer.query(query);
// 取查询结果
SolrDocumentList solrDocumentList = queryResponse.getResults();
// 取查询结果总记录数
long numFound = solrDocumentList.getNumFound();
SearchResult result = new SearchResult();
result.setRecourdCount(numFound);
// 取商品列表,需要取高亮显示
List<SearchItem> itemList = new ArrayList<>();
Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
for (SolrDocument solrDocument : solrDocumentList) {
// 取商品信息
SearchItem searchItem = new SearchItem();
searchItem.setId((String) solrDocument.get("id"));
searchItem.setCategory_name((String) solrDocument.get("item_category_name"));
searchItem.setImage((String) solrDocument.get("item_image"));
searchItem.setPrice((long) solrDocument.get("item_price"));
searchItem.setSell_point((String) solrDocument.get("item_sell_point"));
// 取高亮结果
List<String> list = highlighting.get(solrDocument.get("id")).get("item_title");
String itemTitle = "";
if (list != null && list.size() > 0) {
itemTitle = list.get(0);
} else {
itemTitle = (String) solrDocument.get("item_title");
}
searchItem.setTitle(itemTitle);
// 添加到商品列表
itemList.add(searchItem);
}
result.setItemList(itemList);
// 返回结果
return result;
}
}
二、service层
需要有一个接口一个实现类,需要对外发布服务。
参数:StringkeyWord
int page
int rows
返回值:SearchResult
业务逻辑:
1)根据参数创建一个查询条件对象。需要指定默认搜索域,还需要配置高亮显示。
2)调用dao查询。得到一个SearchResult对象
3)计算查询总页数,每页显示记录数就是rows参数。
/**
* 商品搜索service
*
*/
@Service
public class SearchServiceImpl implements SearchService {
@Autowired
private SearchDao searchDao;
@Override
public SearchResult search(String keyword, int page, int rows) throws Exception {
// 创建一个SolrQuery对象
SolrQuery query = new SolrQuery();
// 设置查询条件
query.setQuery(keyword);
// 设置分页条件
if (page <= 0)
page = 1;
query.setStart((page - 1) * rows);
query.setRows(rows);
// 设置默认搜索域
query.set("df", "item_title");
// 设置高亮显示
query.setHighlight(true);
query.addHighlightField("item_title");
query.setHighlightSimplePre("<em style=\"color:red\">");
query.setHighlightSimplePost("</em>");
// 执行查询
SearchResult searchResult = searchDao.search(query);
// 计算总页数
int recourdCount = (int) searchResult.getRecourdCount();
int pages = recourdCount / rows;
if (recourdCount % rows > 0)
pages++;
// 设置到返回结果
searchResult.setTotalPages(pages);
return searchResult;
}
}
发布服务:
三、web层
引用服务:
/**
* 商品搜索controller
*
*/
@Controller
public class SearchController {
@Autowired
private SearchService searchService;
@Value("${SEARCH_RESULT_ROWS}")
private Integer SEARCH_RESULT_ROWS;
@RequestMapping("/search")
public String searchItemList(String keyword, @RequestParam(defaultValue = "1") Integer page, Model model)
throws Exception {
// 查询商品列表
SearchResult searchResult = searchService.search(keyword, page, SEARCH_RESULT_ROWS);
// 把结果传递给页面
model.addAttribute("query", keyword);
model.addAttribute("totalPages", searchResult.getTotalPages());
model.addAttribute("page", page);
model.addAttribute("recordCount", searchResult.getRecourdCount());
model.addAttribute("itemList", searchResult.getItemList());
return "search";
}
}
测试:
该install的install
端口号要和search-web运行的端口号一致
乱码。
没有图片,那我们启动manager-web,添加一个手机。
添加到索引库
终于有了: