【问题标题】:Solr - match exact number of multivalue fieldsSolr - 匹配多值字段的确切数量
【发布时间】:2013-10-09 15:01:33
【问题描述】:

我的文档中有以下内容:

<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

应该返回那个文件。

但它不起作用。

我是不是走错了路?

【问题讨论】:

  • iwayneo 你找到解决这个问题的方法了吗?
  • 你有什么异常吗?执行查询时发生了什么?
  • 我检查了您的查询。它工作正常。

标签: solr solr4


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2013-12-15
    相关资源
    最近更新 更多