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,"审核失败");
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
禁忌搜索算法(Tabu Search, TS)是一种模拟人类智能的优化算法,用于解决组合优化问题。它通过在搜索过程中维护一个禁忌表来避免陷入局部最优解,并通过引入禁忌策略来探索更多的解空间。 禁忌搜索算法的基本流程如下: 1. 初始化:随机生成一个初始解,并将禁忌表置空。 2. 迭代搜索:在每一次迭代中,根据当前解和禁忌表选择一个邻域解作为下一步的候选解。 3. 评估候选解:计算候选解的目标函数值,并根据目标函数值和禁忌表的限制条件决定是否接受候选解。 4. 更新禁忌表:根据当前解和候选解的变化情况更新禁忌表,以避免重复搜索相同的解。 5. 终止条件:根据预设的终止条件(例如达到最大迭代次数或目标函数值满足要求)判断是否结束搜索。 禁忌搜索算法的关键在于如何选择邻域解和更新禁忌表。邻域解的选择可以通过变换当前解的某个部分来生成,例如交换两个节点的位置或改变某个节点的分配情况。禁忌表的更新可以根据禁忌长度和禁忌策略来确定,常见的禁忌策略包括禁忌次数和禁忌期限。 以下是一个使用Python实现禁忌搜索算法的示例代码: ```python def tabu_search(initial_solution, tabu_length, max_iterations): current_solution = initial_solution best_solution = current_solution tabu_list = [] for _ in range(max_iterations): neighbors = generate_neighbors(current_solution) best_neighbor = None for neighbor in neighbors: if neighbor not in tabu_list: if best_neighbor is None or evaluate_solution(neighbor) < evaluate_solution(best_neighbor): best_neighbor = neighbor current_solution = best_neighbor tabu_list.append(best_neighbor) if len(tabu_list) > tabu_length: tabu_list.pop(0) if evaluate_solution(current_solution) < evaluate_solution(best_solution): best_solution = current_solution return best_solution ``` 请注意,上述代码中的`generate_neighbors`和`evaluate_solution`函数需要根据具体问题进行实现,以生成邻域解和评估解的目标函数值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值