我有一个React前端,它使用用户搜索文本和过滤器选择查询Solr(通过Python / Django)。 Solr通过facet返回产品结果,动态更新显示的方面以及每个方面(或facet.pivot)中的产品数量。
我试图让用户在一个过滤器组中多选两个过滤器。问题是,只要用户选择过滤器,Solr查询就会缩小,并且不再显示相邻过滤器。例如,一旦用户选择“Men's”,就会返回更新的facet组,并且“Women's”不再是一个选项。
尝试的解决方案是存储旧状态并将其重新注入新过滤器组。因此,如果用户选择“Men's”并查询Solr,过滤器组仍将显示[“Men's”,“Women's”]:
if (specs_update) {
json.specs[this.state.spec_clicked_info.group] = this.state.spec_clicked_info.specs;
}
这不起作用。想象一下,用户决定同时选择“男装”和“女装”,然后选择“T恤”(我们商店里只有男士的T恤)。如果他现在要取消选择“Men's”,对Solr的查询仍将包括现在陈旧的“女性”选择,并向用户显示零结果。
答案 0 :(得分:0)
每MatsLindh's条评论我已实施tagging and excluding过滤器,以允许在特定方面组上进行多选。
第一步是在前端跟踪哪个方面组目前已选择任何方面。在Python端,该信息用于在fq
参数上应用标记(例如,fq={!tag=style}casual
)以及facet.field
中的相应排除(例如,facet.field={!ex=style}style
)。
此策略适用于facet.pivot
,但也有一些调整。假设你有一个3层深的'company, collection, sub_collection'
树,但你只想申请标记&不包括collection
和sub_collection
。您无法将标签应用于facet.pivot的某个部分,因此您需要控制前端的顶级company
方面(如果我错了,请更正我)。
一些例子:
https://stackoverflow.com/a/39803098/4822174
http://yonik.com/multi-select-faceting/
但是,我们仍然需要考虑前端认为当前选择仍为gender:Women's
的事实(参见相关示例)。我们可以通过检查后端检查返回的新构面是否包含用户查询的所有组件来实现此目的,如果没有,则删除它们:
for spec, spec_arr in current_filter['specs_filter'].items():
for a_spec in spec_arr:
for key,value in raw_response['facet_counts']['facet_fields'].items():
if key == spec and a_spec not in [*value]:
current_filter['specs_filter'][spec].remove(a_spec)