多关键字搜索处理
在添加条件查询时先对搜索关键字进行替换处理
String keywords = (String) searchMap.get("keywords");
if (keywords!=null && !"".equals(keywords)){
searchMap.put("keywords",keywords.replace(" ",""));
}
搜索结果排序
导入Sort的包如图所示
Sort s = new Sort(sort,sortField);
Sort 的默认构造方法是可以接收多个参数的,即使我们传入了排序方式(DESC或者ASC)和排序字段并没有报错,但是它的排序还是默认排序方式
所以我们使用下面的构造方法,这个构造方法排序方式是枚举类型的,只能是Sort.Direction类的ASC或DESC
String sortField = (String) searchMap.get("sortField");
String sort = (String) searchMap.get("sort");
if (!"".equals(sortField)){
Sort s = null;
if (sort.equals("desc")){
s = new Sort(Sort.Direction.DESC,sortField);
}else{
s = new Sort(Sort.Direction.ASC,sortField);
}
query.addSort(s);
}
同步索引库
solr数据库的数据信息需要和数据库进行同步
- 当我们删除商品之后,就需要把索引信息从solr中删除
- 新增商品,商品审核通过之后,商品信息需要添加到solr中
- 修改商品时,商品状态为待审核,这个时候就需要先把商品信息从solr中移除,等审核通过后,索引信息就会被同步到索引库
添加索引和删除索引的操作
public void importList(List<TbItem> list) {
//处理规格格式
for (TbItem item : list) {
Map<String,Object> specMap = JSON.parseObject(item.getSpec(), Map.class);//转成map格式
Map map = new HashMap();//临时map
for (String key : specMap.keySet()) {
// 第一个参数:要转换的中文
// 第二参数:分隔符,没有的话,就写空串
map.put(Pinyin.toPinyin(key,"").toLowerCase(),specMap.get(key));
}
System.out.println(map);
//给动态域名赋值
item.setSpecMap(map);
}
System.out.println("导入索引到solr");
solrTemplate.saveBeans(list);
solrTemplate.commit();
}
@Override
public void deleteByGoodsIds(Long[] goodsId) {
Query query = new SimpleQuery();
Criteria criteria = new Criteria("item_goodsid").in(goodsId);
query.addCriteria(criteria);
System.out.println("从solr删除索引");
solrTemplate.delete(query);
solrTemplate.commit();
}
获取操作的商品列表
public List<TbItem> findItemByGoodsId(Long[] ids, String status) {
TbItemExample example = new TbItemExample();
TbItemExample.Criteria criteria = example.createCriteria();
criteria.andGoodsIdIn(Arrays.asList(ids));
criteria.andStatusEqualTo(status);
List<TbItem> items = itemMapper.selectByExample(example);
return items;
}
商家删除商品
@RequestMapping("/delete")
public Result delete(Long [] ids){
try {
goodsService.delete(ids);
//从solr中删除索引
searchService.deleteByGoodsIds(ids);
return new Result(true, "删除成功");
} catch (Exception e) {
e.printStackTrace();
return new Result(false, "删除失败");
}
}
商家修改商品
@RequestMapping("/update")
public Result update(@RequestBody Goods goods){
//验证商品是否是当前商家的id
Goods goods2 = goodsService.findOne(goods.getGoods().getId());
//从spring security中获取商家id
String sellerId = SecurityContextHolder.getContext().getAuthentication().getName();
//如果传递过来的商家ID并不是当前登录的用户的ID,则属于非法操作
if (!goods2.getGoods().getSellerId().equals(sellerId) || !goods.getGoods().getSellerId().equals(sellerId)){
return new Result(false, "操作非法");
}
try {
goodsService.update(goods);
//删除索引
searchService.deleteByGoodsIds(new Long[]{goods.getGoods().getId()});
return new Result(true, "修改成功");
} catch (Exception e) {
e.printStackTrace();
return new Result(false, "修改失败");
}
}
运营商审核商品通过
@RequestMapping("/updateAuditStatus")
public Result updateStatus(Long[] ids,String status){
try {
goodsService.updateStatus(ids,status);
//如果审核成功,将数据同步到索引库
if ("1".equals(status)){
List<TbItem> items = goodsService.findItemByGoodsId(ids, status);
searchService.importList(items);
}
return new Result(true,"审核成功");
}catch (Exception e){
e.printStackTrace();
return new Result(false,"审核失败");
}
}