修改
如果我不能很好地解释我的需要,我很抱歉。我会尝试给出更好的解释。
我拥有:数百万个具有字段X的文档,另一个字段Y和另一个不需要的字段Z(因此在某些文档中可能为空而在其他文档中不为空。)
我想做什么:搜索字段X等于某事物的文档并按字段Z对它们进行分组(这样每个字段Z值只返回1个文档),但我想要字段Z为空的文档要包含在结果中(所有这些),并按字段Y对结果进行排序(因此我无法将请求分成两个请求)。
我希望这更清楚。
答案 0 :(得分:1)
这是我能找到的最佳答案(来自solr邮件列表用户):
想法是使用字段Z的复制字段,并且在索引数据时,如果字段Z为空,则在复制字段中生成唯一值。分组时,使用复制字段而不是字段Z. (如果字段Z仅用于分组,则可以单独使用而不使用复制字段。)
答案 1 :(得分:0)
您可以group.query
使用group.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
更新:我看到上面的内容不起作用。所以建议我编辑答案,而不是删除上面的答案并给出新答案: - )。
你不能这样做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