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);
}
}
//高亮显示处理 .....
}
/**
* 根据关键字搜索列表
* @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;
}
solr在搜索时是将搜索关键字进行分词,然后按照或的关系来进行搜索的。
有些用户会在关键字中间习惯性的输入一些空格,而这个空格输入后,很有可能查询不到结果了。所以我们还要对空格至于做一下处理,删除关键字中的空格。
@Override
public Map<String, Object> search(Map searchMap) {
//关键字空格处理
String keywords = (String) searchMap.get("keywords");
searchMap.put("keywords", keywords.replace(" ", ""));
..................
}
/**
* 根据关键字搜索列表
* @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;
}
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
*/
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("");
//后缀
options.setSimplePostfix("");
//高亮的字段
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
*/
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();
}
}