加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 04:46:20 所属栏目:安全 来源:网络整理
导读:前面已经讲过 如果安装及配置Solr服务器了,那么现在我们就来正式在代码中使用Solr. 1,这里Solr主要是怎么使用的呢?? 当我们在前台页面搜索商品名称关键词时,我们这时是在Solr库中去查找相应的商品信息,然后将搜索关键词高亮. 2,那么Solr库中的商品信息又是如

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

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

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

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

一,商品上架

<<<

点击上架触发isShow事件:

接着到Controller层:ProductController.java:

@RequestMapping("/isShow.do" "forward:/product/list.do" }

接着看Service层:ProdcutServiceImpl.java:

     @Autowired
    private SolrServer solrServer;
               Product product =          product.setIsShow(                      
               
             
             SolrInputDocument doc =              
             doc.setField("id"             
             Product p =             doc.setField("name_ik"             
             doc.setField("url",p.getImgUrls()[0             
             doc.setField("brandId"             
             SkuQuery skuQuery =               skuQuery.setOrderByClause("price asc"             skuQuery.setPageNo(1             skuQuery.setPageSize(1             List skus =             doc.setField("price",skus.get(0             
             
                            }                  
               
      }

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

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

encoding org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 encoding / portal org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springmvc-portal.xml 1 portal /

第二个就是

这样就就可以直接访问了.当我们输入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" }

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

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

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

<div class="cnblogs_code">

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

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

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

map = new HashMap(); jedis.hset("brand" }

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

List List brands = ArrayList Map hgetAll = jedis.hgetAll("brand" Set> entrySet = (Entry Brand brand = }

到了这里redis查询brand就完成了,那么继续看下关于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=" QueryResponse response = response = } 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.setPrice((Float)doc.get("price" product.setBrandId(Long.parseLong(String.valueOf((Integer)doc.get("brandId" Pagination pagination = ( String url = "/search" }

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

?

?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读