# Multi-Select Faceting 功能说明 ## 概述 Multi-Select Faceting(多选分面)是业界标准的 Faceted Search 功能,允许用户在选中某个分面筛选项后,仍然能看到该分面的其他可选项,提供更好的探索式搜索体验。 ## 功能特性 ### 1. 两种 Faceting 模式 #### 标准模式(Conjunctive Faceting) - **设置**: `multi_select: false`(默认) - **行为**: 选中某个分面值后,该分面只显示选中的值 - **适用场景**: 层级下钻、逐步精炼 - **ES 实现**: 过滤器应用在 `query.bool.filter` #### Multi-Select 模式(Disjunctive Faceting) - **设置**: `multi_select: true` - **行为**: 选中某个分面值后,该分面仍显示所有可选项 - **适用场景**: 颜色、品牌、尺码等可切换属性 - **ES 实现**: 过滤器应用在 `post_filter` ### 2. Selected 状态标记 所有 facet 值都包含 `selected` 字段,标记当前是否被选中: - `selected: true` - 当前筛选项已被选中 - `selected: false` - 当前筛选项未被选中 ## 使用示例 ### 示例 1: 标准 Category Faceting ```json { "query": "T恤", "filters": { "category1_name": "服装" }, "facets": [ { "field": "category1_name", "size": 10, "type": "terms", "multi_select": false } ] } ``` **响应**: ```json { "results": [...], "facets": [ { "field": "category1_name", "values": [ {"value": "服装", "count": 150, "selected": true} ] } ] } ``` ### 示例 2: Multi-Select Brand Faceting ```json { "query": "手机", "filters": { "brand_name": "苹果" }, "facets": [ { "field": "brand_name", "size": 10, "type": "terms", "multi_select": true } ] } ``` **响应**: ```json { "results": [...只包含苹果手机...], "facets": [ { "field": "brand_name", "values": [ {"value": "苹果", "count": 150, "selected": true}, {"value": "华为", "count": 120, "selected": false}, {"value": "小米", "count": 98, "selected": false} ] } ] } ``` ### 示例 3: Specifications Multi-Select ```json { "query": "衬衫", "filters": { "specifications": { "name": "颜色", "value": "白色" } }, "facets": [ { "field": "specifications.颜色", "size": 10, "type": "terms", "multi_select": true }, { "field": "specifications.尺码", "size": 10, "type": "terms", "multi_select": false } ] } ``` **响应**: ```json { "results": [...只包含白色衬衫...], "facets": [ { "field": "specifications.颜色", "label": "颜色", "values": [ {"value": "白色", "count": 50, "selected": true}, {"value": "蓝色", "count": 35, "selected": false}, {"value": "黑色", "count": 28, "selected": false} ] }, { "field": "specifications.尺码", "label": "尺码", "values": [ {"value": "M", "count": 20, "selected": false}, {"value": "L", "count": 18, "selected": false}, {"value": "XL", "count": 12, "selected": false} ] } ] } ``` 注意:尺码分面(`multi_select: false`)的统计是基于白色衬衫的。 ### 示例 4: 混合多个 Multi-Select Facets ```json { "query": "*", "filters": { "category1_name": "玩具", "specifications": [ {"name": "颜色", "value": "红色"}, {"name": "材质", "value": "塑料"} ] }, "facets": [ { "field": "category1_name", "size": 10, "multi_select": true }, { "field": "specifications.颜色", "size": 10, "multi_select": true }, { "field": "specifications.材质", "size": 10, "multi_select": true }, { "field": "specifications.年龄段", "size": 10, "multi_select": false } ] } ``` **行为说明**: - `category1_name`: 显示所有类目选项(玩具被标记为 selected) - `specifications.颜色`: 显示所有颜色选项(红色被标记为 selected) - `specifications.材质`: 显示所有材质选项(塑料被标记为 selected) - `specifications.年龄段`: 只显示符合当前过滤条件的年龄段选项 ## 前端集成建议 ### React 示例 ```jsx function FacetComponent({ facet }) { return (