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

前端之家收集整理的这篇文章主要介绍了Solr的原理及在项目中的使用实例.前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

前面已经讲过 如果安装及配置Solr服务器了,那么现在我们就来正式在代码中使用Solr.1,这里Solr主要是怎么使用的呢? 

当我们在前台页面搜索商品名称关键词时,我们这时是在Solr库中去查找相应的商品信息,然后将搜索关键词高亮.

2,那么Solr库中的商品信息又是如何添加的呢? 

当我们在给商品上架的时候,将商品信息update 到MysqL数据库中的bbs_product表中,然后同样的将相应的信息 添加到Solr库中.接下来就看代码的具体实现吧: 

一,商品上架

<删除"@H_404_37@<@H_404_37@<@H_404_37@@H_403_64@

点击上架触发isShow事件:

@H_403_64@

接着到Controller层:ProductController.java:

添加页面 @RequestMapping("/isShow.do" "forward:/product/list.do" }@H_403_64@

接着看Service层:ProdcutServiceImpl.java:

@H_403_64@
     @Autowired
    private SolrServer solrServer;
               Product product =          product.setIsShow(                      
               
             
             SolrInputDocument doc =              
             doc.setField("id"             名称
             Product p =             doc.setField("name_ik"             图片URL
             doc.setField("url",p.getImgUrls()[0             
             doc.setField("brandId"             SQL查询语句: select price from bbs_sku where product_id = ? order by price asc limit 1
             SkuQuery skuQuery =               skuQuery.setOrderByClause("price asc"             skuQuery.setPageNo(1             skuQuery.setPageSize(1             List skus =             doc.setField("price",skus.get(0             
             
                            }                  
               静态化
      }@H_403_64@

这里使用SolrInputDocument 来保存商品信息,其中doc.setField("name_ik",p.getName());的name_ik 是我们在solr 配置文件配置的IK 分词器的字段, doc.setField("url",p.getImgUrls()[0]); 这里我们也只是取第一张图片的url用来展示.这里我们还用到了skuQuery,因为一个商品中不同的颜色不同的尺码都可能有不同的价格,我们在这里 是取到同一个productId下价格最小的来给显示~然后再就是将我们已经设置好的注册好了的,在这里直接注入即可使用.spring来管理Solr:

到了这里上架的功能就做好了,这也是给后面Solr查询做好铺垫.二,前台使用Solr查询到了这里就开始查看前台页面了,前台页面是扒的网上的,具体业务逻辑是自己修改的,页面如下:

拦截器变成了: /,而且过滤掉静态资源,配置如下:首先是babasport-portal project下的web.xml文件:

第二个就是配置文件中设置过滤掉静态资源:

@H_404_37@ @H_404_37@ @H_404_37@@H_403_64@

这样就就可以直接访问了.当我们输入2016 点击查询后会出现什么? 我把已经做好的页面展示一下: 搜索框输入2016 且点击 搜索时: 方法:

首页 @RequestMapping(value="/" "index" 搜索 @RequestMapping(value="/search" List brands = model.addAttribute("brands" Map map = HashMap ( != map.put("品牌" ( != String[] split = price.split("-" (split.length == 2 map.put("价格" } map.put("价格",price + "以上" model.addAttribute("map" Pagination pagination = model.addAttribute("pagination" model.addAttribute("keyword" model.addAttribute("price" model.addAttribute("brandId" "search" }@H_403_64@

提示: 这里使用到了SolrService,相信看我以前博文的朋友都知道这个地方还需要配置dubbo,就是服务提供方和适用方,这里为了简便直接略过,实际开发中是必须要配置的,否则就调用不了SolrService中的方法了.这个controller 中往search.jsp中put了很多东西,具体这些东西什么用我们可以先不管,我们先看下search.jsp页面.而且这个controller中查询brand 是从redis中查询出来的,我们会在下面讲到这个.

已选条件: ${m.key }:<${m.value }< @H_403_64@

上面这个地方就是为何要在controller设置map值了,这个是显示已选择的过滤条件.

<div class="cnblogs_code">

 
 
     
         <品牌:
         
             
                 
                 
                     
                         <${brand.name }
                     
                 
                 
             
         
     
 
 
 
 
     
         <价格:
         
             
                 
                     
                         <0-99
                     
                     
                         <100-299
                     
                     
                         <300-599
                     
                     
                         <600-999
                     
                     
                         <1000-1599
                     
                     
                         <1600以上
                     
                 
             
         
     
 
 @H_403_64@

接下来我们来看下对应的js方法:

@H_403_64@

这个就可以实现 添加 过滤条件的选项了.三,使用Redis 取出商品品牌列表首先 当我们在后台添加或者修改品牌时,我们应该同样将这个品牌添加到Redis中,格式类似于: {"brandId":"brandName"}controller层:(当我们在后台添加或者修改品牌)

修改 修改 时修改Redis中的品牌,hmset适合批量添加品牌 map = new HashMap(); jedis.hset("brand" }@H_403_64@

redis中有了品牌列表后,然后就是查询了: 

查询Redis中的品牌结果集 List List brands = ArrayList Map hgetAll = jedis.hgetAll("brand" Set> entrySet = (Entry Brand brand = }@H_403_64@

到了这里redis查询brand就完成了,那么继续看下关于solr 是如何加入过滤条件的吧: 

查询商品信息从Solr ProductQuery productQuery = productQuery.setPageSize(8 SolrQuery solrQuery = 名称 solrQuery.set("q","name_ik:"+ StringBuilder params = params.append("keyword=" solrQuery.addSort("price" solrQuery.setHighlight( solrQuery.addHighlightField("name_ik" 2016 solrQuery.setHighlightSimplePre("" solrQuery.setHighlightSimplePost("" ( != solrQuery.addFilterQuery("brandId:"+ params.append("&brandId=" ( != String[] split = price.split("-" (split.length == 2 solrQuery.addFilterQuery("price:["+split[0]+" TO "+split[1]+"]" } solrQuery.addFilterQuery("price:["+split[0]+" TO *]" params.append("&price=" 分页 limit 开始行,每页数 QueryResponse response = response = } 获取到List: String 0,1,2.... Map>> highlighting = List products = ArrayList SolrDocumentList docs = numFound = Product product = String id = (String)doc.get("id" Map> map = List list = map.get("name_ik" 名称 product.setName(list.get(0)); 图片 String url = (String)doc.get("url" 属性直接添加到了Product中 查询的是bbs_sku中price最小的值 然后保存到solr中的,所以这里我们就直接将price属性添加到product中了 product.setPrice((Float)doc.get("price" product.setBrandId(Long.parseLong(String.valueOf((Integer)doc.get("brandId" Pagination pagination = ( 页面展示 String url = "/search" }@H_403_64@

这个就是本博文的重中之重了,code上面都加了注释,相信还是比较容易理解的.

 

 

猜你在找的Redis相关文章