品优购09——搜索解决方案solr02

1. 搜索结果分页

1.1 后端分页

要实现分页,首先需要知道当前页pageNo和每页显示多少条数据pageSize

所以,代码如下:

// 1.6 分页
Integer pageNo = (Integer) searchMap.get("pageNo");
Integer pageSize = (Integer) searchMap.get("pageSize");
if(null == pageNo){
	pageNo = 1;
}
if(null == pageSize){
	pageSize = 30;
}
query.setOffset((pageNo-1)*pageSize);   // 设置起始索引
query.setRows(pageSize);				// 设置每页记录数

末了,要设置分页数据给前端,如图:

1.2 前端

1.2.1 构建分页栏

// 构建分页栏
function buildPageLabel(){
	$scope.pageLabel=[];//新增分页栏属性
	var firstPage = 1;
	var lastPage = $scope.resultMap.totalPages;
	
	if($scope.resultMap.totalPages > 5){ // 如果总页数大于5
		
		if($scope.searchMap.pageNo <= 3){ // 如果当前页 <= 3 显示前5页
			lastPage = 5
		} else if($scope.searchMap.pageNo >= $scope.resultMap.totalPages-2){ // 如果当前页 >= 后两页  显示后5页
			firstPage = $scope.resultMap.totalPages - 4;
		} else {
			firstPage = $scope.searchMap.pageNo - 2 ;
			lastPage = $scope.searchMap.pageNo + 2 ;
		}
		
	}
	
	//循环产生页码标签	
	for(var i = firstPage ; i <= lastPage ; i++){
		$scope.pageLabel.push(i);
	}
}

在search方法中调用;

1.2.2 构建分页查询方法

// 分页查询
$scope.queryPage = function(page) {
	
	if(page < 1 || page > $scope.resultMap.totalPages){
		return;
	}
	
	$scope.searchMap.pageNo = page;
	$scope.search();
}

页面绑定变量即可

2. 排序

2.1 排序后端

2.2 前端

js方法定义:

	$scope.sortSearch = function(sort,sortField) {
		
		$scope.searchMap.sort = sort;
		$scope.searchMap.sortField = sortField;
		
		// 执行查询
		$scope.search();
	}

2.2.1 价格排序

2.2.2 新品排序

新品排序其实就是按照上架时间降序排序

1)在solor定义一个上架时间域

<field name="item_updateTime" type="date" indexed="true" stored="true" />

2)给TBItem实体类的updateTime字段添加注解

@Field("item_updateTime")
private Date updateTime;

3)执行solrUtil导入数据到solor

进入solr管理台,看字段值是否成功导入,如图:

发现,成功导入

4)给新品标签添加排序方法

3. 隐藏品牌列表

如果用户输入的是品牌的关键字,则隐藏品牌列表

// 隐藏品牌列表
$scope.keywordsIsBrand = function() {
	var bList = $scope.resultMap.brandList;
	for(var i = 0 ; i < bList.length ; i ++){
		if($scope.searchMap.keywords.indexOf($scope.resultMap.brandList[i].text) != -1){
			return true;  // 表示存在
		}
	}
	return false;
	
}

界面引用

4. 搜索页与首页对接

实现思路:首页的搜索框输入关键字,点击搜索后自动跳转到搜索页查询,通过参数传递的方式,将查询关键字传递给搜索页

4.1 pinyougou-portal-web工程

在controller中添加如下代码

// 首页搜索功能
$scope.search = function() {
	location.href="http://localhost:9104/#?keywords="+$scope.keywords;
}

在HTML中进行数据绑定

4.2 在pinyougou-search-web工程

在controller中添加如下代码

// 接收首页的跳转请求
$scope.loadkeywords = function() {
	$scope.searchMap.keywords = $location.search()['keywords'];
	$scope.search();
}

在HTML页面添加初始化调用

5. 更新索引库

5.1 商品审核之后更新索引库

1)修改pinyougou-sellergoods-interface的GoodsService.java,新增方法并下service中实现

@Override
public List<TbItem> findItemListByGoodsIdandStatus(Long[] goodsIds, String status) {
	TbItemExample example=new TbItemExample();
com.pinyougou.pojo.TbItemExample.Criteria criteria = example.createCriteria();
	criteria.andGoodsIdIn(Arrays.asList(goodsIds));
	criteria.andStatusEqualTo(status);
	return itemMapper.selectByExample(example);
}

2)修改pinyougou-search-interface的ItemSearchService.java,并在服务层实现

@Override
public void importList(List list) {
	solrTemplate.saveBeans(list);	
	solrTemplate.commit();
}

3)修改pinyougou-manager-web工程的GoodsController.java

@Reference
private ItemSearchService itemSearchService;
@RequestMapping("/updateStatus")
public Result updateStatus(Long[] ids,String status){
	try {
		goodsService.updateStatus(ids, status);
		//按照SPU ID查询 SKU列表(状态为1)		
		if(status.equals("1")){//审核通过
			List<TbItem> itemList = goodsService.findItemListByGoodsIdandStatus(ids, status);						
			//调用搜索接口实现数据批量导入
			if(itemList.size()>0){				
				itemSearchService.importList(itemList);
			}else{
				System.out.println("没有明细数据");
			}
		}
		return new Result(true, "修改状态成功"); 
	} catch (Exception e) {
		e.printStackTrace();
		return new Result(false, "修改状态失败");
	}
}

5.2 商品删除同步索引数据

1)修改pinyougou-search-interface的ItemSearchService.java,实现服务层

@Override
public void deleteByGoodsIds(List goodsIdList) {
	System.out.println("删除商品ID"+goodsIdList);
	Query query=new SimpleQuery();		
	Criteria criteria=new Criteria("item_goodsid").in(goodsIdList);
	query.addCriteria(criteria);
	solrTemplate.delete(query);
	solrTemplate.commit();
}

2)修改pinyougou-manager-web的GoodsController.java

/**
 * 批量删除
 * @param ids
 * @return
 */
@RequestMapping("/deleGoods")
public Result deleGoods(Long [] ids){
	try {
		goodsService.deleGoods(ids);
		try {
			itemSearchService.deleteByGoodsIds(Arrays.asList(ids));
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("删除索引失败!");
		}
		
		return new Result(true, "删除成功"); 
	} catch (Exception e) {
		e.printStackTrace();
		return new Result(false, "删除失败");
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值