多關鍵字搜索處理
在添加條件查詢時先對搜索關鍵字進行替換處理
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,"審覈失敗");
}
}