styxmx 发表于 2017-12-19 12:34:11

Solr的原理及在项目中的使用实例

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-991600
  
37         if(null != price){
  
38             String[] split = price.split("-");
  
39             //如果切割后的长度等于2 就说明这是一个价格区间
  
40             if(split.length == 2){
  
41               solrQuery.addFilterQuery("price:["+split+" TO "+split+"]");
  
42             }else {
  
43               solrQuery.addFilterQuery("price:["+split+" 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   }
页: [1]
查看完整版本: Solr的原理及在项目中的使用实例