solr的應用(五)多關鍵字搜索、搜索結果排序、同步索引庫

多關鍵字搜索處理

在添加條件查詢時先對搜索關鍵字進行替換處理
在這裏插入圖片描述

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,"審覈失敗");
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章