|
1 @Autowired
2 private SolrServer solrServer;
3 //查询商品信息从Solr
4 public Pagination selectPaginationFromSolr(Integer pageNo, String keyword, String price, Long brandId){
5 ProductQuery productQuery = new ProductQuery();
6 //当前页
7 productQuery.setPageNo(Pagination.cpn(pageNo));
8 //每页数
9 productQuery.setPageSize(8);
10
11 SolrQuery solrQuery = new SolrQuery();
12 //关键词 商品名称
13 solrQuery.set("q", "name_ik:"+keyword);
14 //回显数据
15 StringBuilder params = new StringBuilder();
16 params.append("keyword=").append(keyword);
17
18 //排序
19 solrQuery.addSort("price", ORDER.asc);
20
21 //高亮
22 //1,设置, 打开高亮的开关
23 solrQuery.setHighlight(true);
24 //2, 设置高亮字段
25 solrQuery.addHighlightField("name_ik");
26 //3, 设置关键字高亮的样式 <span style='color:red'>2016</span>
27 //设置前缀和后缀
28 solrQuery.setHighlightSimplePre("<span style='color:red'>");
29 solrQuery.setHighlightSimplePost("</span>");
30
31 //过滤条件 品牌
32 if(null != brandId){
33 solrQuery.addFilterQuery("brandId:"+brandId);
34 params.append("&brandId=").append(brandId);
35 }
36 //过滤价格 0-99 1600
37 if(null != price){
38 String[] split = price.split("-");
39 //如果切割后的长度等于2 就说明这是一个价格区间
40 if(split.length == 2){
41 solrQuery.addFilterQuery("price:["+split[0]+" TO "+split[1]+"]");
42 }else {
43 solrQuery.addFilterQuery("price:["+split[0]+" TO *]");
44 }
45 params.append("&price=").append(price);
46 }
47
48 //分页 limit 开始行,每页数
49 solrQuery.setStart(productQuery.getStartRow());
50 solrQuery.setRows(productQuery.getPageSize());
51
52 QueryResponse response = null;
53 try {
54 response = solrServer.query(solrQuery);
55
56 } catch (Exception e) {
57 e.printStackTrace();
58 }
59 //分析这个Map
60 //第一层Map: Key String ==>
61 //第二层Map: Key String == name_ik : Value: List
62 //获取到List: String 0,1,2....
63 Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
64
65
66 List<Product> products = new ArrayList<Product>();
67 //结果集
68 SolrDocumentList docs = response.getResults();
69 //总条数
70 long numFound = docs.getNumFound();
71 for (SolrDocument doc : docs) {
72 Product product = new Product();
73 //商品的ID
74 String>
75 product.setId(Long.parseLong(id));
76
77 //取第二层Map
78 Map<String, List<String>> map = highlighting.get(id);
79 //取List集合
80 List<String> list = map.get("name_ik");
81
82 //商品名称
83 //String name = (String)doc.get("name_ik");
84 //product.setName(name);
85 product.setName(list.get(0)); //list.get(0) 中的name是已经设置为高亮的
86
87 //图片
88 String url = (String)doc.get("url");
89 product.setImgUrl(url);
90 //价格 这里的价格本身是保存在bbs_sku表中的, 而我们在这里将price属性直接添加到了Product中
91 //因为我们在做上架的时候, 查询的是bbs_sku中price最小的值 然后保存到solr中的, 所以这里我们就直接将price属性添加到product中了
92 //这里的价格只有一个值
93 //Float price = (Float)doc.get("price");
94 product.setPrice((Float)doc.get("price"));
95 //品牌ID
96 //Integer brandId = (Integer)doc.get("brandId");
97 product.setBrandId(Long.parseLong(String.valueOf((Integer)doc.get("brandId"))));
98 products.add(product);
99 }
100
101 Pagination pagination = new Pagination(
102 productQuery.getPageNo(),
103 productQuery.getPageSize(),
104 (int)numFound,
105 products
106 );
107 //页面展示
108 String url = "/search";
109 pagination.pageView(url, params.toString());
110
111 return pagination;
112 } |
|
|