业务规则:
(1)当用户输入关键字搜索后,除了显示列表结果外,还应该显示通过这个关键字搜索到的记录都有哪些商品分类。
(2)根据第一个商品分类查询对应的模板,根据模板查询出品牌列表
(3)根据第一个商品分类查询对应的模板,根据模板查询出规格列表
(4)当用户点击搜索面板的商品分类时,显示按照这个关键字查询结果的基础上,筛选此分类的结果。
(5)当用户点击搜索面板的品牌时,显示在以上结果的基础上,筛选此品牌的结果
(6)当用户点击搜索面板的规格时,显示在以上结果的基础上,筛选此规格的结果
(7)当用户点击价格区间时,显示在以上结果的基础上,按价格进行筛选的结果
(8)当用户点击搜索面板的相应条件时,隐藏已点击的条件。
2.1 实现思路
(1)搜索面板的商品分类需要使用 Spring Data Solr 的分组查询来实现
(2)为了能够提高查询速度,我们需要把查询面板的品牌、规格数据提前放入 redis
(3)查询条件的构建、面板的隐藏需要使用 angularJS 来实现
(4)后端的分类、品牌、规格、价格区间查询需要使用过滤查询来实现
3.查询分类列表
3.1 需求分析根据搜索关键字查询商品分类名称列表
3.1 后端代码
修改 SearchItemServiceImpl.java 创建方法
[AppleScript] 纯文本查看 复制代码
/**
*查询分类列表
*@param searchMap
*@return
*/
private List searchCategoryList(Map searchMap){
List<String> list=new ArrayList();
Query query=new SimpleQuery();
//按照关键字查询Criteria criteria=new
Criteria("item_keywords").is(searchMap.get("keywords"));
query.addCriteria(criteria);
//设置分组选项
GroupOptions groupOptions=new GroupOptions().addGroupByField("item_category");
query.setGroupOptions(groupOptions);
//得到分组页
GroupPage<TbItem> page = solrTemplate.queryForGroupPage(query, TbItem.class);
//根据列得到分组结果集
GroupResult<TbItem> groupResult = page.getGroupResult("item_category");
//得到分组结果入口页
Page<GroupEntry<TbItem>> groupEntries = groupResult.getGroupEntries();
//得到分组入口集合
List<GroupEntry<TbItem>> content = groupEntries.getContent();
[AppleScript] 纯文本查看 复制代码
for(GroupEntry<TbItem> entry:content){
list.add(entry.getGroupValue());//将分组结果的名称封装到返回值中
}
return list;
}
search 方法调用
[AppleScript] 纯文本查看 复制代码
@Override
public Map<String, Object> search(Map searchMap) { Map<String,Object> map=new HashMap<>();
//1.按关键字查询(高亮显示)
......
//2.根据关键字查询商品分类
List categoryList = searchCategoryList(searchMap); map.put("categoryList",categoryList);
return map;
}
3.1 前端代码
修改 search.html
[AppleScript] 纯文本查看 复制代码
<div class="type-wrap" ng-if="resultMap.categoryList!=null">
<div class="fl key">商品分类</div>
<div class="fl value">
<span ng-repeat="category in resultMap.categoryList">
<a href="#">{{category}}</a>
</span>
</div>
<div class="fl ext"></div>
</div>