Solr - 匹配多值字段的确切数量

时间:2013-10-09 15:01:34

标签: solr solr4

我的文档中有以下内容:

<int name="groupCount">4</int>
<arr name="groupId">
    <str>1001</str>
    <str>1002</str>
    <str>1003</str>
    <str>1009</str>
</arr>

在我的查询中,我想获取用户所属的所有文档,至少是文档所属的所有组。

具有群组的用户:

1001
1002
1003
1009
1010

将在doc。中指定的所有组中看到上述文档。

拥有群组的用户:

1001    
1002
1003
1010

不会因为他们缺少1009组。

为此,我在文档中添加了一个groupCount字段,告诉我该文档有多少个组。计划是我可以检查用户组与文档组的匹配数,并将其与groupCount字段进行比较。如果它们相同,则用户可以看到该文档。

要做到这一点,我希望从命中数中减去groupCount得到零 - 如果用户在所有组中我得到0 - 用户可以看到文档。

我有以下查询:

fq={!frange l= 0 u=0}sub(groupCount,sum(termfreq(groupId,1001),termfreq(groupId,1002),termfreq(groupId,1003),termfreq(groupId,1009)))

正如您所看到的 - 对于上述文档,我希望所有termfreq查询的总和返回4,因为有4次点击。 sub(groupId,4)应返回0

{frange l=0 u=0} 0

应该返回该文件。

但它不起作用。

我是以错误的方式解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

通常,在搜索中处理多值字段为“至少一个匹配”。 - 想到两种可能适合您的方法:

创建一个单独的集合,其中每个用户/组都是自己的doc。我理解这听起来有点矫枉过正,但是如果你只有几个字段,并且它们被编入索引但没有存储,那么影响可能不会太糟糕。您可以手动管理交叉集合查询,或尝试利用联接: https://wiki.apache.org/solr/Join

另一种选择是将成员资格构建为子文档,并使用块查询来过滤子项符合条件的条目。见:https://cwiki.apache.org/confluence/display/solr/Other+Parsers#OtherParsers-BlockJoinQueryParsers 了解更多信息。