Hibernate Search选中分面不过滤自身分组的实现方案咨询
解决方案
Hibernate Search默认选中分面后,对应的筛选条件会作用于所有分面的计数计算,这就是选中某颜色后同组其他颜色选项消失的核心原因。我们可以直接使用框架原生提供的配置实现需求,不需要手动禁用/启用分面组,改动量极小。
适配你现有代码的修改方案(基于Hibernate Search 5.x)
只需要在选中分面的逻辑中追加doNotApplyToFacets配置,指定当前分面的筛选规则不作用于自身分面组的计数即可,修改后的代码片段如下:
if (!StringUtils.isEmpty(request.color)) { fullTextQuery.getFacetManager().getFacets(FACET_COLOR) .stream().filter(f -> f.getValue().equals(request.color)).forEach(found -> { fullTextQuery.getFacetManager().getFacetGroup(FACET_COLOR) .selectFacets(found) .doNotApplyToFacets(FACET_COLOR); // 新增这行配置 }); } if (!StringUtils.isEmpty(request.size)) { fullTextQuery.getFacetManager().getFacets(FACET_SIZE) .stream().filter(f -> f.getValue().equals(request.size)).forEach(found -> { fullTextQuery.getFacetManager().getFacetGroup(FACET_SIZE) .selectFacets(found) .doNotApplyToFacets(FACET_SIZE); // 新增这行配置 }); }
配置效果说明
- 商品列表查询仍然会应用所有选中的分面条件,比如选中红色后只会返回红色商品,符合预期
- 计算分面计数时会排除自身分组的筛选条件:
- 颜色分面的计数仅会应用尺码分组的筛选条件,不会被选中的颜色条件影响
- 尺码分面的计数仅会应用颜色分组的筛选条件,不会被选中的尺码条件影响
完全匹配主流电商的分面筛选交互逻辑,不需要修改其他业务代码。
可选补充配置
如果需要展示计数为0的分面选项,可以在创建分面请求时开启零计数显示:
FacetingRequest colorFacetRequest = queryBuilder.facet().name(FACET_COLOR).onField(FACET_COLOR) .discrete() .includeZeroCounts(true) // 新增本配置即可 .createFacetingRequest();
内容的提问来源于stack exchange,提问作者Andreas Radauer
相关产品推荐
相关产品推荐

