SpringDataSolr( 三 )

xiaoxiao2025-11-01  22

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(); } }
转载请注明原文地址: https://www.6miu.com/read-5038906.html

最新回复(0)