使用solr实现京东网站中的商品搜索功能,
需求:
1.可以根据关键字搜索商品信息
2.可以根据商品分类、价格过滤搜索结果
3.可以根据价格排序
4.可以实现分页
源码及solrHome下载地址:csdn站内下载
界面如下:
Controller层:获取搜索条件,响应搜索结果到前台页面
service层:使用solrj调用solr的服务进行索引和搜索
dao层:不开发(数据参考solr笔记(二))
1.配置商品图片的虚拟目录 images
我们先来分析一下product_list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
T恤 - 商品筛选
String queryString,String catalog_name,Stringprice,Integer page,String sort
请求返回值:
String(product_list) //返回到product_list.jsp页面
request域需要存储的数据(页面所需数据)
queryString、catalog_name、price、sort、result(curPage、pageCount、recordCount、productList)
业务层:
根据查询条件,调用solrj的api方法,搜索索引库
封装result对象
创建pojo
页面需要什么就传递什么,根据分析简历商品的pojo,pid name price picture
public class Product {
private String pid;
private String name;
private String price;
private String picture;
get/set。。。
}
public class Result {
private Integer curPage;// 当前页
private Integer pageCount;// 总页数
private Long recordCount;// 数据总条数
private List productList;// 商品结果集
get/set。。。
}
public interface SearchService {
/**
* 根据条件从索引库中查询数据
*
* @param queryString 查询关键词
* @param catalog_name 商品分类
* @param price 商品价格
* @param sort 排序
* @param page 当前页码
* @return
*/
Result search(String queryString, String catalog_name, String price, String sort, Integer page);
}
@Service
public class SearchServiceImpl implements SearchService {
@Autowired
private HttpSolrServer httpSolrServer;
@Override
public Result search(String queryString, String catalog_name, String price, String sort, Integer page) {
// 创建SolrQuery对象
SolrQuery solrQuery = new SolrQuery();
// 设置查询关键词
if (StringUtils.isNotBlank(queryString)) {
solrQuery.setQuery(queryString);
} else {
solrQuery.setQuery("*:*");
}
// 设置默认域
solrQuery.set("df", "product_keywords");
// 设置商品类名过滤条件
// 设置商品分类名称
if (StringUtils.isNotBlank(catalog_name)) {
catalog_name = "product_catalog_name:" + catalog_name;
}
// 设置商品价格
if (StringUtils.isNotBlank(price)) {
String[] sp = price.split("-");
if (sp != null && sp.length == 2) {
price = "product_price:[" + sp[0] + " TO " + sp[1] + "]";
}
}
solrQuery.setFilterQueries(catalog_name, price);
// 商品排序,如果是1,正序排序,如果是其他,则倒序排序
if ("1".equals(sort)) {
solrQuery.setSort("product_price", ORDER.asc);
} else {
solrQuery.setSort("product_price", ORDER.desc);
}
// 设置分页
if (page == null) {
page = 1;
}
solrQuery.setStart((page - 1) * 20);
solrQuery.setRows(20);
// 设置高亮
solrQuery.setHighlight(true);
solrQuery.addHighlightField("product_name");
solrQuery.setHighlightSimplePre("");
solrQuery.setHighlightSimplePost("");
// 查询数据
QueryResponse response;
try {
response = httpSolrServer.query(solrQuery);
// 获取查询总数
SolrDocumentList results = response.getResults();
long total = results.getNumFound();
// 获取高亮数据
Map>> map = response.getHighlighting();
// 解析结果集,存放到Product中
List products = new ArrayList<>();
for (SolrDocument solrDocument : results) {
Product product = new Product();
// 商品id
product.setPid(solrDocument.get("id").toString());
// 商品标题,设置高亮
List list = map.get(solrDocument.get("id")).get("product_name");
if (list != null && list.size() > 0) {
product.setName(list.get(0));
} else {
product.setName(solrDocument.get("product_name").toString());
}
// 商品价格
product.setPrice(solrDocument.get("product_price").toString());
// 商品图片
product.setPicture(solrDocument.get("product_picture").toString());
products.add(product);
}
// 封装返回对象
Result result = new Result();
result.setCurPage(page);
result.setRecordCount(total);
result.setProductList(products);
// 总页数计算公式(total+rows-1)/rows
result.setPageCount((int) (total + 20 - 1) / 20);
return result;
} catch (SolrServerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
controller
@Controller
@RequestMapping("/product")
public class ProductController {
@Autowired
private SearchService searchService;
@RequestMapping("list")
public String queryProduct(Model model, String queryString, String catalog_name, String price, String sort,
Integer page) {
// 根据条件搜索
Result result = this.searchService.search(queryString, catalog_name, price, sort, page);
// 把结果集放到模型中
model.addAttribute("result", result);
// 搜索条件数据回显
model.addAttribute("queryString", queryString);
model.addAttribute("catalog_name", catalog_name);
model.addAttribute("price", price);
model.addAttribute("sort", sort);
model.addAttribute("page", page);
return "product_list";
}
}