通过SpringDataSolr提供的分组查询完成商品分类列表的查询
(1)当用户输入关键字搜索后,除了显示列表结果外,还应该显示通过这个关键字搜索到的记录都有哪些商品分类。
(2)根据第一个商品分类查询对应的模板,根据模板查询出品牌列表
(3)根据第一个商品分类查询对应的模板,根据模板查询出规格列表
(4)当用户点击搜索面板的商品分类时,显示按照这个关键字查询结果的基础上,筛选此分类的结果。
(5)当用户点击搜索面板的品牌时,显示在以上结果的基础上,筛选此品牌的结果
(6)当用户点击搜索面板的规格时,显示在以上结果的基础上,筛选此规格的结果
(7)当用户点击价格区间时,显示在以上结果的基础上,按价格进行筛选的结果
(8)当用户点击搜索面板的相应条件时,隐藏已点击的条件。
之前SQL语句的分组查询:
比如说查询tb_item表中的分类名称
SELECT `category` FROM tb_item GROUP BY category;
得到以下结果:
Spring Data Solr提供了一组API,我们可以去调用。
solrTemplate.queryForGroupPage()
/**
* 分组查询
* 查询商品分类列表
* @param searchMap
* @return
*/
private List<String> searchCategoryList(Map searchMap) {
List<String> list = new ArrayList();
Query query = new SimpleQuery("*:*");
// 关键字查询
Criteria criteria = new Criteria("item_keywords");
criteria.is(searchMap.get("keywords")); // 相当于sql的where子句
query.addCriteria(criteria);
// 设置分组选项
GroupOptions groupOptions = new GroupOptions();
groupOptions.addGroupByField("item_category");// 相当于sql的group by
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();
for (GroupEntry<TbItem> groupEntry : content) {
// 将分组的结果添加到list中。
list.add(groupEntry.getGroupValue());
}
return list;
}
里面提到的域是在solrhome中配置的<field>
标签:
<fieldType name="text_ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer" />
</fieldType>
<!-- 自定义域 -->
<!-- 域 -->
<field name="item_goodsId" type="long" indexed="true" stored="true"/>
<field name="item_title" type="text_ik" indexed="true" stored="true"/>
<field name="item_price" type="double" indexed="true" stored="true"/>
<field name="item_image" type="string" indexed="false" stored="true" />
<field name="item_category" type="string" indexed="true" stored="true" />
<field name="item_seller" type="text_ik" indexed="true" stored="true" />
<field name="item_brand" type="string" indexed="true" stored="true" />
<!--复制域-->
<field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="item_title" dest="item_keywords"/>
<copyField source="item_category" dest="item_keywords"/>
<copyField source="item_seller" dest="item_keywords"/>
<copyField source="item_brand" dest="item_keywords"/>
<!-- 规格动态域 -->
<dynamicField name="item_spec_*" type="string" indexed="true" stored="true" />