3

编辑

如果我没有很好地解释我的需求,我很抱歉。我会尽力给出更好的解释。

我所拥有的:数以百万计的文档有一个字段 X ,另一个字段 Y 和另一个不需要的字段 Z (因此它在某些文档中可以是空的,而在其他文档中则不是)。

我想要做的:搜索字段 X 等于某些内容的文档,并按字段 Z 对它们进行分组(以便每个字段 Z 值仅返回 1 个文档),但我希望包含字段 Z 为空的文档在结果中(全部),并按字段 Y 对结果进行排序(所以我不能将请求分成两个请求)。

我希望这更清楚。

4

2 回答 2

1

这是我能为我的问题找到的最佳答案(来自 solr 邮件列表用户):

思路是使用字段Z的一个拷贝字段,在索引数据时,如果字段Z为空,则在拷贝字段中生成一个唯一值。并且在分组时,使用复制字段而不是字段Z。(如果只需要字段Z进行分组,则可以单独使用他没有复制字段)。

于 2013-02-25T14:03:37.863 回答
0

您可以使用group.querywithgroup.main来实现这一点。

例如,下面的查询获取价格从 0 到 10 的所有文档,并按受欢迎程度对结果进行分组。设置group.query=popularity:[* TO *]确保流行存在。制作group.main=true确保 group.query 结果是主要结果。

select?q=price:[0%20TO%20 10]&wt=json&group=true&group.field=popularity&group.query=popularity:[*%20TO%20*]&group.main=true

参考https://wiki.apache.org/solr/FieldCollapsing

更新:我看到以上不起作用。SO建议我编辑答案,而不是删除上面的答案并给出新答案:-)。

你不能做2个这样的查询吗?

“搜索字段 X 等于某些内容的文档,并按字段 Z 对它们进行分组(这样每个字段 Z 值仅返回 1 个文档)”

q=X:1&group=true&group.field=Z

“我希望将字段 Z 为空的文档(全部)包含在结果中,并按字段 Y 对结果进行排序”

q=(X:1 AND -Z:[* TO *])&rows=SOME_LARGE_NUMBER&sort=Y asc
于 2013-02-22T15:28:17.640 回答