.搜索业务规则分析2.1 需求分析
我们今天要完成的目标是在关键字搜索的基础上添加面板搜索功能。面板上有商品分类、品牌、各种规格和价格区间等条件
业务规则:
(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>
|