1

我的文档中有以下内容:

<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

将看到上述文档,因为它们位于文档中指定的所有组中。

具有组的用户:

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

应该返回那个文件。

但它不起作用。

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

4

1 回答 1

0

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

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

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

于 2015-03-17T13:28:13.990 回答