前面已经讲过 如果安装及配置Solr服务器了, 那么现在我们就来正式在代码中使用Solr.
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>