Solr 搜索

solr 文件

<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-solr</artifactId>
                <version>${spring.data.solr.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>



 <dependency>
                <groupId>org.springframework.data</groupId>
                <artifactId>spring-data-solr</artifactId>
            </dependency>

            <!-- 默认 starter 会加载 solrj 进来, 下面这个可不引-->
            <dependency>
                <groupId>org.apache.solr</groupId>
                <artifactId>solr-solrj</artifactId>
                <version>6.6.2</version>
            </dependency>

application.yml

  data:
    solr:
      host: http://xxx.com/solr

搜索类:

 /**
     * 商品搜索,排序
     * @param pname 名称
     * @param page 页码
     * @param size 每页的数量
     * @param cid 分类id
     * @param from_where 来源
     * @param pid 商品id
     * @param price_min 最小价格
     * @param price_max 最大价格
     * @param discount_min 最少折扣
     * @param discount_max 最大折扣
     * @param sort 排序
     * @param min_time 同步时间
     * @param max_time
     * @param sid 供应商id
     * @return
     * @throws ParseException
     */
    @RequestMapping("/getSolrData2")
    public Object getSolrData2(String pname,Integer page,Integer size,String cid,String from_where,String pid,
                               String price_min,String price_max,String discount_min,String discount_max,
                               String sort,String min_time,String max_time,String sid) throws ParseException {
        if("0000".equals(cid)){
            Map<String,Object> result  = new HashMap<>();
            result.put("status","9");
            result.put("msg","没有数据");
            result.put("data",null);
            return result;
        }



        SolrQuery query = new SolrQuery();
        query.set("defType","edismax");
        query.set("mm","100%");

        // 创建组合条件串
        StringBuilder params = new StringBuilder();
        if(StringUtils.isNoneBlank(pname)){
            params.append("item_ProName:"+pname);
        }else{
            params.append("item_ProName:*");
        }
        // 默认搜索字段
        query.set("df", "item_ProName");

        try {
            // 设置过滤条件,设置分页
            if(page==null)page=1;
            if(size==null)size=60;
            query.setStart((page-1)*size);//page-1 * rows
            query.setRows(size);
            params.append(" AND item_IsOnSell:1");
            // 来源
            if(StringUtils.isNoneBlank(from_where)){
                productService.getFromWhere(from_where,params);
            }
//            String sell = "1";
//            params.append(" AND item_IsOnSell2:"+"("+sell+")");
            // item_SupplierId
            if(StringUtils.isNoneBlank(sid)){
                params.append(" AND item_SupplierId:"+sid);
            }

            // 分类id
            if(StringUtils.isNoneBlank(cid)){
//                params.append(" AND item_CategoryId:"+cid);
                productService.getCategoryCid(cid,params);
            }
            // 排序
            if(StringUtils.isNoneBlank(sort)){
                productService.getSort(sort,query);
            }else{
//                productService.getSort("1",query);
            }
            //根据添加时间搜索
            if(StringUtils.isNoneBlank(min_time) || StringUtils.isNoneBlank(max_time)){
                productService.getAddDateSort(min_time,max_time,query,params);
            }

            // 多个商品id
            if(StringUtils.isNoneBlank(pid)){
                productService.getManeyPid(pid,params);
            }

            // 价格
            if(StringUtils.isNoneBlank(price_min) || StringUtils.isNoneBlank(price_max)){
                productService.getPriceSort(price_min,price_max,params);
            }
            // 折扣
            if(StringUtils.isNoneBlank(discount_min) || StringUtils.isNoneBlank(discount_max)){
                productService.getDiscount(discount_min,discount_max,params);
            }

            if(cid!=null && !"".equals(cid)){
                if(pname!=null && !"".equals(pname)){
                    query.setFilterQueries(pname);
                }
            }

            } catch (Exception e) {
            e.printStackTrace();
            Map<String,Object> result  = new HashMap<>();
            result.put("status","1");
            result.put("msg","参数错误");
            return result;
        }
        Map<String,Object> result  = new HashMap<>();

        try {
            if("".equals(pname) || pname == null ){

            }else{
                //2.3设置高亮
                query.setHighlight(true);
                query.setHighlightSimplePre("<em style=\"color:red\">");
                query.setHighlightSimplePost("</em>");
                query.addHighlightField("item_ProName");//设置高亮显示的域
            }
            query.setQuery(params.toString());
            // 这里需要对价格进行处理,暂时没处理
            // 就是需要判断是否登录,然后价格乘以折扣
//            List<SolrProduct> solrProducts = productService.getSolrProduct(query,from_where,pname,cid);

            Map<String,Object> solrProducts = productService.getSolrProduct(query,from_where,pname,cid);
            Map<String,Object> data = new HashMap<>();
            if(solrProducts!=null){
                data.put("total",solrProducts.get("total"));
                data.put("data_list",solrProducts.get("solrProducts"));
            } else {
                data.put("total",0);
                data.put("data_list",null);
            }

            result.put("status","0");
            result.put("msg","获取列表数据成功");
            result.put("data",data);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        result.put("status","2");
        result.put("msg","数据异常");
        return result;
    }


    /**
     * 给搜索添加排序
     * @param sort
     */
    @Override
    public void getSort(String sort,SolrQuery query ) {
        if(StringUtils.isNoneBlank(sort)) {
            if (sort.equals("1")) {
                query.setSort("item_Discount", SolrQuery.ORDER.asc);
            }
            if (sort.equals("2")) {
                query.setSort("item_prosum", SolrQuery.ORDER.asc);
            }
            if (sort.equals("3")) {
                query.setSort("item_prosum", SolrQuery.ORDER.desc);
            }
            if (sort.equals("4")) {
                query.setSort("item_Prices", SolrQuery.ORDER.asc);
            }
            if (sort.equals("5")) {
                query.setSort("item_Prices", SolrQuery.ORDER.desc);
            }
            if (sort.equals("6")) {
                query.setSort("item_Discount", SolrQuery.ORDER.desc);
            }
        }
    }

    /**
     * 按照同步时间排序
     * @param min_time 小时间
     * @param max_time 大时间
     * @param query
     */
    @Override
    public void getAddDateSort(String min_time, String max_time, SolrQuery query,StringBuilder params)   {
        try {
            if(StringUtils.isNoneBlank(min_time)){
                Date mindate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(min_time);
                if(StringUtils.isNoneBlank(max_time)){
                    Date maxdate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(min_time);
                    params.append(" AND item_AddDate2:"+"["+mindate.getTime()+" TO "+maxdate.getTime()+"]");
                }
                params.append(" AND item_AddDate2:["+mindate.getTime()+" TO *]");
            }
            if(StringUtils.isNoneBlank(max_time)){
                Date maxdate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(min_time);
                params.append(" AND item_AddDate2:[* TO "+maxdate.getTime()+"]");
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    /**
     * 根据商品id 查询多个商品
     * @param pid
     * @param params
     */
    @Override
    public void getManeyPid(String pid, StringBuilder params) {
        String[] strs = pid.split(",");
        StringBuilder builder = new StringBuilder();
        for(int i=0;i<strs.length;i++){
            builder.append(strs[i]+" OR ");
        }
        String item = builder.toString().trim().substring(0,builder.toString().trim().length()-2);
        params.append(" AND id:"+"("+item+")");
    }

    /**
     * 商品分类这里:
     * 不知道传的是一级还是二级还是三级,
     * 需要一点一点的匹配
     * 需要solr配置文件里的字段合并   
     * @param cid
     * @param params
     */
    @Override
    public void getCategoryCid(String cid, StringBuilder params) {
        String[] strs = cid.split(",");
        StringBuilder builder = new StringBuilder();
        for(int i=0;i<strs.length;i++){
            builder.append(strs[i]+" OR ");
        }
        String item = builder.toString().trim().substring(0,builder.toString().trim().length()-2);
        params.append(" AND cate:"+"("+item+")");
    }

    @Override
    public void getFromWhere(String fromwhere, StringBuilder params) {
        String[] strs = fromwhere.split(",");
        StringBuilder builder = new StringBuilder();
        for(int i=0;i<strs.length;i++){
            builder.append(strs[i]+" OR ");
        }
        String item = builder.toString().trim().substring(0,builder.toString().trim().length()-2);
        params.append(" AND item_from_where:"+"("+item+")");
    }


    /**
     * 根据商品价格排序
     * solr只能long,所以要*100
     * @param price_min
     * @param price_max
     * @param params
     */
    @Override
    public void getPriceSort(String price_min, String price_max, StringBuilder params) {
        long min = 0;
        if(price_min!=null & !"".equals(price_min)){
            min = Math.round(Double.parseDouble(price_min)*100);
        }
        long max = 0;
        if(price_max!=null && !"".equals(price_max)){
            max = Math.round(Double.parseDouble(price_max)*100);
        }

        if(price_min==null || "".equals(price_min)){
            params.append(" AND item_Prices:[* TO "+max+"]");
        }
        if(price_max==null || "".equals(price_max)){
            params.append(" AND item_Prices:["+min+" TO *]");
        }

        if(price_min!=null & !"".equals(price_min) && price_max!=null && !"".equals(price_max)){
            params.append(" AND item_Prices:"+"["+min+" TO "+max+"]");
        }
    }

    /**
     * 根据商品折扣排序
     * @param discount_min
     * @param discount_max
     * @param params
     */
    @Override
    public void getDiscount(String discount_min, String discount_max, StringBuilder params) {

        long min = 0;
        if(discount_min!=null && !"".equals(discount_min)){
            min = Math.round(Double.parseDouble(discount_min)*10);
        }
        long max = 0;
        if(discount_max!=null && !"".equals(discount_max)){
            max = Math.round(Double.parseDouble(discount_max)*10);
        }


        if(discount_min==null || "".equals(discount_min)){
            params.append(" AND item_Discount1:[* TO "+max+"]");
        }

        if(discount_max==null || "".equals(discount_max)){
            params.append(" AND item_Discount1:["+min+" TO *]");
        }

        if(discount_min!=null & !"".equals(discount_min) && discount_max!=null && !"".equals(discount_max)){
            params.append(" AND item_Discount1:["+min+" TO "+max+"]");
        }
    }

 

 

 

Solr:schema.xml

<!-- 业务域 -->
<field name="item_ProId" type="string" indexed="false" stored="true" />
<field name="item_ProName" type="text_ik" indexed="true" stored="true" />
<field name="item_BalancePrice" type="double" indexed="true" stored="true" />
<field name="item_VipPrice" type="string" indexed="true" stored="true" />
<field name="item_ProImg" type="string" indexed="false" stored="true" />
<field name="item_IsOnSell" type="long" indexed="true" stored="true" />
<field name="item_wholesale_price" type="double" indexed="false" stored="true" />
<field name="item_categoryIdName" type="text_ik" indexed="true" stored="true" />
<field name="item_CategoryCode" type="text_ik" indexed="true" stored="true" />
<field name="item_CategoryThird" type="text_ik" indexed="true" stored="true" />
<field name="item_from_where" type="string" indexed="true" stored="true" />

<field name="item_Prices" type="long" indexed="true" stored="true" />
<field name="item_Discount" type="string" indexed="true" stored="true" />
<field name="item_CategoryId" type="long" indexed="true" stored="true" />

  
<field name="item_SupplierId" type="long" indexed="true" stored="true" />
<field name="item_prosum" type="long" indexed="true" stored="true" />
<field name="item_AddDate" type="string" indexed="true" stored="true" />
<field name="item_AddDate2" type="long" indexed="true" stored="true" />
  
  <!-- 折扣率 -->
<field name="item_Discount1" type="long" indexed="true" stored="true" />
<field name="item_CategoryCode2" type="long" indexed="true" stored="true" />
<field name="item_CategoryThird2" type="long" indexed="true" stored="true" /> 
  <!-- 为了查询多个分类,我这里的业务是一个分类id不知道是几级的所以这样做了 -->
 <field name="cate" type="string" indexed="true" stored="true" multiValued="true"/>
<copyField source="item_CategoryId" dest="cate"/>
<copyField source="item_CategoryCode2" dest="cate"/>
<copyField source="item_CategoryThird2" dest="cate"/>

 

上面的cate就是下面的,你也可以用商品名称,关键词等等一些可以搜到的商品名字做。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小tu豆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值