spring-data-solr查询
根据关键字查询,过滤、排序、高亮显示
public Map<String, Object> highlightSearch(Map searchMap) { //获取查询关键字 String keywords =(String) searchMap.get("keywords"); if(keywords != null){ keywords = keywords.replaceAll(" ",""); } //获取当前页 Integer pageNo = Integer.parseInt(String.valueOf(searchMap.get("pageNo"))); //获取每页多少条数据 Integer pageSize = Integer.parseInt(String.valueOf(searchMap.get("pageSize"))); //过滤查询 //获取页面点击分类的过滤条件 String category = (String)searchMap.get("category"); //获取页面点击品牌的过滤条件 String brand = (String)searchMap.get("brand"); //获取点击规格的过滤条件 String spec = String.valueOf(searchMap.get("spec")); //获取页面点解价格区间的过滤条件 String price = (String)searchMap.get("price"); //获取页面排序的域(按什么字段排序) String sortField = String.valueOf(searchMap.get("sortField")); //获取页面排序的规则(升序、降序) String sortType = String.valueOf(searchMap.get("sort")); //封装查询的对象 HighlightQuery query = new SimpleHighlightQuery(); //查询的条件对象 Criteria criteria = new Criteria("item_keywords").is(keywords); //将查询条件对象,放入查询对象中 query.addCriteria(criteria); //计算当前页第一条数据的索引是几。 if(pageNo == null || pageNo <= 0){ pageNo = 1; } Integer start = (pageNo - 1) * pageSize; //设置查询对象从第几条开始查询 query.setOffset(start); //设置每页多少条数据 query.setRows(pageSize); //创建高亮显示对象 HighlightOptions highlightOptions = new HighlightOptions(); //设置哪个域需要高亮显示 highlightOptions.addField("item_title"); //设置高亮的前缀 highlightOptions.setSimplePrefix("<em style = 'color:red'>"); //设置高亮的后缀 highlightOptions.setSimplePostfix("</em>"); //将高亮显示对象,加入到查询对象中 query.setHighlightOptions(highlightOptions); //根据分类过滤查询 if(category != null && !"".equals(category)){ //创建过滤对象 FilterQuery simpleFilterQuery = new SimpleFilterQuery(); //查询的条件对象 Criteria filterCriteria = new Criteria("item_category").is(category); //将查询条件对象,放入过滤对象中 simpleFilterQuery.addCriteria(filterCriteria); //过滤,放入查询对象中 query.addFilterQuery(simpleFilterQuery); } //根据品牌过滤查询 if(brand != null && !"".equals(brand)){ //创建过滤对象 FilterQuery simpleFilterQuery = new SimpleFilterQuery(); //创建查询条件 Criteria brandCriteria = new Criteria("item_brand").is(brand); //将查询条件放入过滤对象 simpleFilterQuery.addCriteria(brandCriteria); //将过滤对象放入查询对象 query.addFilterQuery(simpleFilterQuery); } //根据规格查询,spec中的数据格式:json格式 if(spec != null && !"".equals(spec)){ Map<String,String> specMap = JSON.parseObject(spec, Map.class); System.out.println(specMap); if(specMap != null && searchMap.size() > 0){ Set<Map.Entry<String, String>> entries = specMap.entrySet(); for(Map.Entry<String, String> entry : entries){ //创建过滤查询对象 FilterQuery simpleFilterQuery = new SimpleFilterQuery(); //创建查询条件 System.out.println(entry.getKey()+entry.getValue()); Criteria specCriteria = new Criteria("item_spec_"+entry.getKey()).is(entry.getValue()); //将条件对象放入过滤查询对象中 simpleFilterQuery.addCriteria(specCriteria); //将过滤对象放入到查询对象中 query.addFilterQuery(simpleFilterQuery); } } } //根据价格查询 if(price != null && !"".equals(price)){ //切割price字符串。 //如果价格区间为0-500元,那么切割后的数组中第一个元素的值为0,第二个值的元素为500 String[] split = price.split("-"); if(split != null && split.length == 2){ //既不是第一个元素为0,也不是最后一个元素为*的其他区间,需要满足两个条件:split[0]<价格区间<split[1]。 //如果split[0]为0,代表价格区间只需要小于split[1]这一个条件即可,所以不需要进入该if语句。 if(!"0".equals(split[0])){ //创建过滤查询条件 FilterQuery simpleFilterQuery = new SimpleFilterQuery(); //创建查询条件 Criteria priceCriteria = new Criteria("item_price").greaterThanEqual(split[0]); //将条件对象放入过滤查询对象中 simpleFilterQuery.addCriteria(priceCriteria); //将过滤对象放入到查询对象中 query.addFilterQuery(simpleFilterQuery); } //如果split[1]为*,代表要查的价格区间为:split[0]以上的所有商品,所以只需要满足大于split[0]这一个条件即可。不需要进入该if语句 if(!"*".equals(split[1])){ //创建过滤查询条件 FilterQuery simpleFilterQuery = new SimpleFilterQuery(); //创建查询条件 Criteria priceCriteria = new Criteria("item_price").lessThanEqual(split[1]); //将条件对象放入过滤查询对象中 simpleFilterQuery.addCriteria(priceCriteria); //将过滤对象放入到查询对象中 query.addFilterQuery(simpleFilterQuery); } } } //添加排序的条件 if(sortField != null && sortType != null && !"".equals(sortField) && !"".equals(sortType)){ //升序 if("asc".equalsIgnoreCase(sortType)){ //创建一个排序对象(枚举,一组常量的值) Sort sort = new Sort(Sort.Direction.ASC, "item_" + sortField); //将排序对象放入查询对象中 query.addSort(sort); } //降序 if("desc".equalsIgnoreCase(sortType)){ //创建一个排序对象(枚举,一组常量的值) Sort sort = new Sort(Sort.Direction.DESC, "item_" + sortField); //将排序对象放入查询对象中 query.addSort(sort); } } //查询并且返回结果 HighlightPage<Item> items = solrTemplate.queryForHighlightPage(query, Item.class); //获取带高亮的集合 List<HighlightEntry<Item>> highlighted = items.getHighlighted(); //创建itemList,用来存放查出的Item List<Item> itemList = new ArrayList<>(); //遍历高亮集合 for(HighlightEntry<Item> itemHighlightEntry : highlighted){ Item item = itemHighlightEntry.getEntity(); //getEntity:Item [Hash = 514230796, id=1156083, title=OPPO R3(R7007)黑色 移动4G手机, sellPoint=null, .... List<HighlightEntry.Highlight> highlights = itemHighlightEntry.getHighlights(); //highlights=[org.springframework.data.solr.core.query.result.HighlightEntry$Highlight@5001ef52] if(highlights != null && highlights.size() > 0){ //获取高亮的标题集合 List<String> highLightTitle = highlights.get(0).getSnipplets(); //highLightTitle=[OPPO R3(R7007)黑色 移动4G<em style = 'color:red'>手机</em>] //判断高亮集合是否为空 if(highLightTitle != null && highLightTitle.size() > 0 ){ //获取高亮的标题 String title = highLightTitle.get(0); //title = OPPO R3(R7007)黑色 移动4G<em style = 'color:red'>手机</em> item.setTitle(title); } } itemList.add(item); } Map<String, Object> resultMap = new HashMap<>(); //查询到的结果集 resultMap.put("rows",itemList); //查询到的总页数 resultMap.put("totalPage",items.getTotalPages()); //查询到的总条数 resultMap.put("total",items.getTotalElements()); return resultMap; }