SpringDataSolr( 三 )

SpringDataSolr

1.区间过滤

new Criteria(“item_price”).greaterThanEqual(price[0]); 大于等于

new Criteria(“item_price”).lessThanEqual(price[1]); 小于等于

/**
 * 根据关键字搜索列表
 * @param keywords
 * @return
 */
private Map searchList(Map searchMap){
	......	
    //1.1关键字查询.....
    //1.2按分类筛选.....
    //1.3按品牌筛选.....
    //1.4过滤规格	......
    //1.5按价格筛选.....
    //price:"0-500"  || price:"500-1000" || price:"1000-*"
    if(!"".equals(searchMap.get("price"))){
        String[] price = ((String) searchMap.get("price")).split("-");
        if(!price[0].equals("0")){//如果区间起点不等于0
            Criteria filterCriteria=new Criteria("item_price").greaterThanEqual(price[0]);
            FilterQuery filterQuery=new SimpleFilterQuery(filterCriteria);
            query.addFilterQuery(filterQuery);				
        }		
        if(!price[1].equals("*")){//如果区间终点不等于*
            Criteria filterCriteria=new  Criteria("item_price").lessThanEqual(price[1]);
            FilterQuery filterQuery=new SimpleFilterQuery(filterCriteria);
            query.addFilterQuery(filterQuery);				
        }
    }		
    //高亮显示处理	.....
}
2.分页
/**
 * 根据关键字搜索列表
 * @param keywords
 * @return
 */
private Map searchList(Map searchMap){

    //1.6 分页查询		
    Integer pageNo= (Integer) searchMap.get("pageNo");//提取页码
    if(pageNo==null){
        pageNo=1;//默认第一页
    }
    Integer pageSize=(Integer) searchMap.get("pageSize");//每页记录数 
    if(pageSize==null){
        pageSize=20;//默认20
    }
    query.setOffset((pageNo-1)*pageSize);//从第几条记录查询
    query.setRows(pageSize);		
    //高亮显示处理
    ......
    
    Map map=new HashMap<>();
    map.put("rows", page.getContent());	//item集合	
    map.put("totalPages", page.getTotalPages());//返回总页数
    map.put("total", page.getTotalElements());//返回总记录数
    return map;
}
3.多关键字搜索

solr在搜索时是将搜索关键字进行分词,然后按照或的关系来进行搜索的。

有些用户会在关键字中间习惯性的输入一些空格,而这个空格输入后,很有可能查询不到结果了。所以我们还要对空格至于做一下处理,删除关键字中的空格。

@Override
public Map<String, Object> search(Map searchMap) {
    //关键字空格处理 
    String keywords = (String) searchMap.get("keywords");
    searchMap.put("keywords", keywords.replace(" ", ""));
    ..................
}
4.排序
/**
 * 根据关键字搜索列表
 * @param keywords
 * @return
 */
private Map searchList(Map searchMap){
    ........
    //1.7排序
    String sortValue= (String) searchMap.get("sort");//ASC  DESC  
    String sortField= (String) searchMap.get("sortField");//排序字段
    if(sortValue!=null && !sortValue.equals("")){  
        if(sortValue.equals("ASC")){
            Sort sort=new Sort(Sort.Direction.ASC, "item_"+sortField);
            query.addSort(sort);
        }
        if(sortValue.equals("DESC")){		
            Sort sort=new Sort(Sort.Direction.DESC, "item_"+sortField);
            query.addSort(sort);
        }			
    }
    //高亮显示处理
    ......
    return map;
}

searchService 1.0

package com.pyg.search.service;

import java.util.List;
import java.util.Map;

/**
 * @author QuietHR
 * @Title: ItemSearchService
 * @ProjectName 
 * @Description: 商品搜索接口
 */
public interface ItemSearchService {

     /**
      * @Description: 搜索方法
      * @param searchMap
      * @return java.util.Map<java.lang.String,java.lang.Object>
      */
     Map<String,Object> search(Map searchMap);

     /**
      * @Description: SKU上架时 更新索引库
      * @param list
      * @return void
      */
     void importList(List list);

     /**
      * @Description: SKU下架时 更新索引库
      * @param goodsIdList
      * @return void
      */
     void deleteByGoodsIds(List goodsIdList);

}

package com.pyg.search.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.pyg.pojo.TbItem;
import com.pyg.search.service.ItemSearchService;
import org.apache.solr.common.util.Hash;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Sort;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.*;
import org.springframework.data.solr.core.query.result.*;

import java.util.*;

/**
 * @Title: ItemServiceImpl
 * @ProjectName PYG
 * @Description: TODO
 */
@Service(timeout = 3000)
public class ItemServiceImpl implements ItemSearchService {

    @Autowired	
    private SolrTemplate solrTemplate;
    @Autowired
    private RedisTemplate redisTemplate;


    @Override
    public Map<String, Object> search(Map searchMap) {
        Map resultMap=new HashMap();
        //多关键字处理
        String keywords = (String) searchMap.get("keywords");
        keywords = keywords.replace(" ", "");
        searchMap.put("keywords",keywords);
        //高亮分页
        resultMap.putAll(searchList(searchMap));
        
        //搜索面板显示的 分类
        List<String> categoryList = searchCategory(searchMap);
        resultMap.put("categoryList",categoryList);

        //搜索面板显示的 品牌和规格
        String category = (String) searchMap.get("category");
        if(!category.equals("")){
            resultMap.putAll(searchBrandAndSpec(category));
        }else if(categoryList.size()>0){
            resultMap.putAll(searchBrandAndSpec(categoryList.get(0)));
        }

        return resultMap;
    }


	/**
     * @Description: 搜索SKU集合
     * @param searchMap
     * @return java.util.Map
     */
    private  Map searchList(Map searchMap){
        
        Map map=new HashMap();
		
        //高亮query
        HighlightQuery query = new SimpleHighlightQuery();
        //设置关键字条件
        Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
		//设置高亮选项
        HighlightOptions options = new HighlightOptions();
        //前缀
        options.setSimplePrefix("<em style='color:red'>");
        //后缀
        options.setSimplePostfix("</em>");
        //高亮的字段
        options.addField("item_title");

        query.addCriteria(criteria);
        query.setHighlightOptions(options);

        //分类过滤
        if(!searchMap.get("category").equals("")){
            FilterQuery filterQuery = new SimpleFilterQuery();
            Criteria filterCriteria = new Criteria("item_category").is(searchMap.get("category"));
            filterQuery.addCriteria(filterCriteria);
            query.addFilterQuery(filterQuery);
        }
        //品牌过滤
        if(!searchMap.get("brand").equals("")){
            FilterQuery filterQuery = new SimpleFilterQuery();
            Criteria filterCriteria = new Criteria("item_brand").is(searchMap.get("brand"));
            filterQuery.addCriteria(filterCriteria);
            query.addFilterQuery(filterQuery);
        }
        //规格过滤
        if(searchMap.get("spec")!=null){
            Map<String,String> spec = (Map) searchMap.get("spec");
            for (String key : spec.keySet()) {
                FilterQuery filterQuery = new SimpleFilterQuery();
                Criteria filterCriteria = new Criteria("item_spec_" + key).is(spec.get(key));
                filterQuery.addCriteria(filterCriteria);
                query.addFilterQuery(filterQuery);
            }
        }
        
        //价格区间过滤
        if(!searchMap.get("price").equals("")){
            String price = (String) searchMap.get("price");
            String[] split = price.split("-");
            if(!split[0].equals("0")){
                FilterQuery filterQuery=new SimpleFilterQuery();

                Criteria criteria1 = new Criteria("item_price").greaterThanEqual(split[0]);
                filterQuery.addCriteria(criteria1);
                query.addFilterQuery(filterQuery);
            }
            if(!split[1].equals("*")){
                FilterQuery filterQuery=new SimpleFilterQuery();
                Criteria criteria1 = new Criteria("item_price").lessThanEqual(split[1]);
                filterQuery.addCriteria(criteria1);
                query.addFilterQuery(filterQuery);

            }

        }

        //排序
        String  sortValue = (String) searchMap.get("sort");
        String  sortField = (String) searchMap.get("sortField");
        if(sortField!=null&&!sortValue.equals("")){
            if(sortValue.equals("ASC")){
                Sort sort = new Sort(Sort.Direction.ASC, "item_" + sortField);
                query.addSort(sort);
            }
            if(sortValue.equals("DESC")){
                Sort sort = new Sort(Sort.Direction.DESC, "item_" + sortField);
                query.addSort(sort);
            }
        }


        //分页
        Integer pageNo = (Integer) searchMap.get("pageNo");
        if(pageNo==null){
            pageNo=1;
        }
        Integer pageSize = (Integer) searchMap.get("pageSize");
        if(pageSize==null){
            pageSize=20;
        }
        
        query.setOffset((pageNo-1)*pageSize);
        query.setRows(pageSize);

        HighlightPage<TbItem> highlightPage = solrTemplate.queryForHighlightPage(query, TbItem.class);
        //拿到记录集合
        List<HighlightEntry<TbItem>> entryList = highlightPage.getHighlighted();
        for (HighlightEntry<TbItem> entry : entryList) {
            TbItem item = entry.getEntity();
            //拿到记录的高亮字段集合
            List<HighlightEntry.Highlight> highlights = entry.getHighlights();
            for (HighlightEntry.Highlight highlight : highlights) {
                //拿到字段数据 可能为多值
                String title = highlight.getSnipplets().get(0);
                item.setTitle(title);
            }
        }
        
        map.put("rows",highlightPage.getContent());
        map.put("totalPages",highlightPage.getTotalPages());
        map.put("total",highlightPage.getTotalElements());
        return map;
    }

    /**
     * @Description: 查询关键字对应的分类 分组查询
     * @param searchMap
     * @return java.util.List<java.lang.String>
     */
    private List<String> searchCategory(Map searchMap){
        List list=new ArrayList();
        Query query = new SimpleQuery();
        Criteria criteria = new Criteria("item_keywords").is(searchMap.get("keywords"));
        query.addCriteria(criteria);
        //分组查询选项
        GroupOptions options = new GroupOptions();
        //分组字段
        options.addGroupByField("item_category");

        query.setGroupOptions(options);
        GroupPage<TbItem> groupPage = solrTemplate.queryForGroupPage(query, TbItem.class);
        GroupResult<TbItem> groupResult = groupPage.getGroupResult("item_category");
        Page<GroupEntry<TbItem>> groupEntries = groupResult.getGroupEntries();
        List<GroupEntry<TbItem>> content = groupEntries.getContent();
        for (GroupEntry<TbItem> entry : content) {
            String value = entry.getGroupValue();
            list.add(value);
        }
        return list;
    }

     /**
     * @Description: 根据分类查找模板 根据模板查找品牌和规格 此处模板品牌规格已放入redis
     * @param category
     * @return java.util.Map
     */
    private Map searchBrandAndSpec(String category){
        Map map=new HashMap();
        Object typeId = redisTemplate.boundHashOps("itemCat").get(category);
        if(typeId!=null){
            Object brandList = redisTemplate.boundHashOps("brandList").get(typeId);
            Object specList = redisTemplate.boundHashOps("specList").get(typeId);
            map.put("brandList",brandList);
            map.put("specList",specList);
        }
        return map;
    }


    @Override
    public void importList(List list) {
        solrTemplate.saveBeans(list);
        solrTemplate.commit();
    }

    @Override
    public void deleteByGoodsIds(List goodsIdList) {
        Query query=new SimpleQuery();
        Criteria criteria=new Criteria("item_goodsid").in(goodsIdList);
        query.addCriteria(criteria);
        solrTemplate.delete(query);
        solrTemplate.commit();
    }


}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值