Solr分组空字段

3

编辑

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

我有什么:数百万个文档,其中有一个字段X,另一个字段Y和另一个字段Z不是必需的(因此在某些文档中可能为空,在其他文档中则不为空)。

我想做什么:查找具有字段X等于某个值的文档,并按字段Z对它们进行分组(以便每个字段Z值只返回1个文档),但我希望将字段Z为空的文档包含在结果中(所有这些文档),并按字段Y对结果进行排序(因此我不能将请求分成两个请求)。

我希望这更清楚了。

3个回答

1
这是我在solr邮件列表用户中找到的最佳答案:
思路是使用字段Z的复制字段,当索引数据时,如果字段Z为空,则在复制字段中生成唯一值。在分组时,使用复制字段而不是字段Z。 (如果字段Z仅用于分组,则可以单独使用而无需复制字段)。

我使用了相同的解决方案,但我认为应该有更好的方法来做到这一点。 - user779420

0

您可以使用group.querygroup.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

这不是我想做的,我想按字段将所有文档分组,但是具有该字段为空的文档不会被分组在一起,但仍包含在结果中。 - Oussama Jilal
谢谢你的帮助,但由于需要排序,我不能执行两个查询。 - Oussama Jilal

0
我通过组合 group.fieldgroup.query 成功让它工作,就像这样:

group.filed=myfield&group.query=-myfield:*

结果是2个对象,您的字段和查询如下:

{ 
  responseHeader: { // },
  grouped: { 
     "myfield": { /// the data },
     "-myfield:*": {/// the data},
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接