【发布时间】:2014-08-29 15:55:09
【问题描述】:
我正在为我们的网站开发产品过滤器,但在使用“facet.missing = true”时遇到了一些困难。
我知道我应该使用“fq=-facetField:[* TO *]”之类的查询过滤器将结果过滤到缺少该字段的产品。
我为我的应用程序构建了一个全局过滤器助手,它为所有查询动态构建 fq 参数,以防止任何人错过基于用户权限的过滤器,这些过滤器基本上看起来像这样 (php):
$params['fq'] = sprintf('((%s) AND (%s))', $custom, $system);
其中 $system 是基于全局权限的过滤器,可能看起来像(不是实际但类似):
(isdiscontinued:0 AND ishidden:0 AND contract:3)
$custom 包含用户通过 UI 构建的实际过滤器查询。假设笔记本蓝牙过滤器的名称为 fq_bluetooth,其值为:否、是,或缺少该值。这将使最终的 fq 看起来像:
((-fq_bluetooth:[* TO *]) AND ((isdiscontinued:0 AND ishidden:0 AND contract:3)))
但是,对于我为此类别发送的查询,这会返回 0 个产品。
如果我将过滤器查询修改为:
((fq_bluetooth:[* TO *]) AND ((isdiscontinued:0 AND ishidden:0 AND contract:3)))
然后我得到了 Yes + No 计数的预期结果,忽略未指定的。
我应该如何格式化过滤器查询以使其正常工作?
[编辑]
我可能还想组合这些方面,并且可能只过滤没有蓝牙的产品或未指定蓝牙的产品。所以也许像这样(当然也不起作用):
((-fq_bluetooth:[* TO *] OR fq_bluetooth:"No") AND ((isdiscontinued:0 AND ishidden:0 AND contract:3)))
我注意到 debugQuery 开启时,我看到一个过滤器查询,例如:
fq_bluetooth:("No" OR -[* TO *])
被解析为:
fq_bluetooth:No -fq_bluetooth:[* TO *]
我在解析后的查询中没有看到 OR - 根据我的研究,fq 参数查询不支持 OR 运算符(??)。
也许 OR 正在工作,但由于否定查询本身似乎失败了,也许这就是为什么我在这样组合时看不到 OR 工作的原因。
【问题讨论】:
标签: solr solr4 faceted-search