设为首页 收藏本站
查看: 1584|回复: 0

[经验分享] Solr的原理及在项目中的使用实例

[复制链接]

尚未签到

发表于 2017-12-19 12:34:11 | 显示全部楼层 |阅读模式
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     }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-425694-1-1.html 上篇帖子: Tomcat、TongWeb5.0、TongWeb6.0部署solr 下篇帖子: solr facet查询及solrj 读取facet数据[转]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表