我的文档中有以下内容:
<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
应该返回该文件。
但它不起作用。
我是以错误的方式解决这个问题吗?
答案 0 :(得分:0)
通常,在搜索中处理多值字段为“至少一个匹配”。 - 想到两种可能适合您的方法:
创建一个单独的集合,其中每个用户/组都是自己的doc。我理解这听起来有点矫枉过正,但是如果你只有几个字段,并且它们被编入索引但没有存储,那么影响可能不会太糟糕。您可以手动管理交叉集合查询,或尝试利用联接: https://wiki.apache.org/solr/Join
另一种选择是将成员资格构建为子文档,并使用块查询来过滤子项符合条件的条目。见:https://cwiki.apache.org/confluence/display/solr/Other+Parsers#OtherParsers-BlockJoinQueryParsers 了解更多信息。