编辑
如果我没有很好地解释我的需求,我很抱歉。我会尝试给出更好的解释。
我有什么:数百万个文档,其中有一个字段X,另一个字段Y和另一个字段Z不是必需的(因此在某些文档中可能为空,在其他文档中则不为空)。
我想做什么:查找具有字段X等于某个值的文档,并按字段Z对它们进行分组(以便每个字段Z值只返回1个文档),但我希望将字段Z为空的文档包含在结果中(所有这些文档),并按字段Y对结果进行排序(因此我不能将请求分成两个请求)。
我希望这更清楚了。
您可以使用group.query
和group.main
来实现这一点。
例如,下面的查询将获取价格在0到10之间的所有文档,并按受欢迎程度对结果进行分组。设置group.query=popularity:[* TO *]
确保受欢迎程度存在。使group.main=true
确保group.query结果是主要结果。
select?q=price:[0%20TO%2010]&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
group.field
和 group.query
成功让它工作,就像这样:
group.filed=myfield&group.query=-myfield:*
结果是2个对象,您的字段和查询如下:
{
responseHeader: { // },
grouped: {
"myfield": { /// the data },
"-myfield:*": {/// the data},
}
}