1,这里Solr主要是怎么使用的呢?
当我们在前台页面搜索商品名称关键词时, 我们这时是在Solr库中去查找相应的商品信息, 然后将搜索关键词高亮.
2,那么Solr库中的商品信息又是如何添加的呢?
当我们在给商品上架的时候, 将商品信息update 到mysql数据库中的bbs_product表中, 然后同样的将相应的信息 添加到Solr库中.
接下来就看代码的具体实现吧:
一, 商品上架
我们在这里点击上架按钮:
list.jsp:
1 <div style="margin-top:15px;"><input class="del-button" type="button" value="删除" onclick="optDelete();"/><input class="add" type="button" value="上架" onclick="isShow('${name}', '${brandId }', '${isShow }' ,'${pagination.pageNo }')"/><input class="del-button" type="button" value="下架" onclick="isHide();"/></div>
点击上架触发isShow事件:
1 <script type="text/javascript">
2 //上架
3 function isShow(name,brandId,isShow,pageNo){
4 //请至少选择一个
5 var size = $("input[name='ids']:checked").size();
6 if(size == 0){
7 alert("请至少选择一个");
8 return;
9 }
10 //你确定上架吗
11 if(!confirm("你确定上架吗")){
12 return;
13 }
14 //提交 Form表单
15 $("#jvForm").attr("action","/product/isShow.do?name="+ name +"&brandId="+brandId+"&isShow="+isShow+"&pageNo="+pageNo);
16 $("#jvForm").attr("method","post");
17 $("#jvForm").submit();
18
19 }
20 </script>
接着到Controller层:
ProductController.java:
1 //添加页面
2 @RequestMapping("/isShow.do")
3 public String isShow(Long[] ids, Model model){
4 productService.isShow(ids);
5 return "forward:/product/list.do";
6 }
接着看Service层:
ProdcutServiceImpl.java:
1 //上架
@Autowired
private SolrServer solrServer;
2 public void isShow(Long[] ids){
3 Product product = new Product();
4 product.setIsShow(true);
5 for (Long id : ids) {
6 //上下架状态
7 product.setId(id);
8 productDao.updateByPrimaryKeySelective(product);
9
10 //TODO 保存商品信息到Solr服务器
11 SolrInputDocument doc = new SolrInputDocument();
12 //ID
13 doc.setField("id", id);
14 //名称
15 Product p = productDao.selectByPrimaryKey(id);
16 doc.setField("name_ik", p.getName());
17 //图片URL
18 doc.setField("url", p.getImgUrls()[0]);
19 //品牌 ID
20 doc.setField("brandId", p.getBrandId());
21 //价格 sql查询语句: select price from bbs_sku where product_id = ? order by price asc limit 1
22 SkuQuery skuQuery = new SkuQuery();
23 skuQuery.createCriteria().andProductIdEqualTo(id);
24 skuQuery.setOrderByClause("price asc");
25 skuQuery.setPageNo(1);
26 skuQuery.setPageSize(1);
27 List<Sku> skus = skuDao.selectByExample(skuQuery);
28 doc.setField("price", skus.get(0).getPrice());
29 //...时间等 剩下的省略
30
31 try {
32 solrServer.add(doc);
33 solrServer.commit();
34 } catch (Exception e) {
35 // TODO Auto-generated catch block
36 e.printStackTrace();
37 }
38 //TODO 静态化
39 }
40 }
这里使用SolrInputDocument 来保存商品信息, 其中doc.setField("name_ik", p.getName());的name_ik 是我们在solr 配置文件配置的IK 分词器的字段, doc.setField("url", p.getImgUrls()[0]); 这里我们也只是取第一张图片的url用来展示.
这里我们还用到了skuQuery, 因为一个商品中不同的颜色不同的尺码都可能有不同的价格, 我们在这里 是取到同一个productId下价格最小的来给显示~
然后再就是将我们已经设置好的SolrInputDocument 通过SolrServer 来提交到Solr服务器. SolrServer是已经在spring中注册好了的, 在这里直接注入即可使用.
spring来管理Solr:
到了这里上架的功能就做好了, 这也是给后面Solr查询做好铺垫.
二, 前台使用Solr查询
到了这里就开始查看前台页面了, 前台页面是扒的网上的, 具体业务逻辑是自己修改的, 页面如下:
这里需要特殊说明一下, 我们配置的全局拦截器变成了: / , 而且过滤掉静态资源, 配置如下:
首先是babasport-portal project下的web.xml文件:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 5 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 6 7 <!-- Post过滤器 --> 8 <filter> 9 <filter-name>encoding</filter-name> 10 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 11 <init-param> 12 <param-name>encoding</param-name> 13 <param-value>UTF-8</param-value> 14 </init-param> 15 </filter> 16 17 <filter-mapping> 18 <filter-name>encoding</filter-name> 19 <url-pattern>/</url-pattern> 20 </filter-mapping> 21 22 <!-- 前端控制器 --> 23 <servlet> 24 <servlet-name>portal</servlet-name> 25 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 26 <init-param> 27 <param-name>contextConfigLocation</param-name> 28 <!-- 默认读取的是 WEB-INF/console-servlet.xml --> 29 <param-value>classpath:springmvc-portal.xml</param-value> 30 </init-param> 31 <load-on-startup>1</load-on-startup> 32 </servlet> 33 34 <servlet-mapping> 35 <servlet-name>portal</servlet-name> 36 <!-- 37 /*: 拦截视图请求: .jsp .js .css 几乎不用,配置静态资源过滤 38 /: 拦截所有,不拦截.jsp 文件, 但是同样拦截.js .css 如果使用也需要配置静态资源过滤(前台系统使用) 39 *.do:拦截所有以.do请求, 后台开发应用*.do 40 --> 41 <url-pattern>/</url-pattern> 42 </servlet-mapping> 43 </web-app>