编辑
如果我没有很好地解释我的需求,我很抱歉。我会尽量给出更好的解释。我所拥有的:数百万个文档都有一个字段X、另一个字段Y和另一个不需要的字段Z(因此在某些文档中它可以为空,而在其他文档中则不能为空)。我想做的是:搜索字段X等于某个值的文档,并按字段Z对其进行分组(这样每个字段Z值只返回一个文档),但我希望将字段Z为空的文档包含在结果中(全部),然后按字段Y对结果进行排序(因此我无法将请求分为两个请求)。我希望这一点更加明确。
lc8prwob1#
这是我能为我的问题找到的最佳答案(来自solr邮件列表用户):其思想是使用字段Z的复制字段,并且在索引数据时,如果字段Z为空,则在复制字段中生成唯一值。分组时,使用复制字段而不是字段Z。(如果字段Z仅用于分组,则可以单独使用而不使用复制字段)。
cx6n0qe32#
您可以使用group.query和e1d1e来实现这一点。例如,下面的查询获取价格从0到10的所有文档,并按流行程度对结果进行分组。设置group.query=popularity:[* TO *]可确保受欢迎程度。制作group.main=true可以确保团队。查询结果是主要结果。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
group.query
group.query=popularity:[* TO *]
group.main=true
select?q=price:[0%20TO%20 10]&wt=json&group=true&group.field=popularity&group.query=popularity:[*%20TO%20*]&group.main=true
更新:我发现上面的方法不起作用。SO建议我编辑答案,而不是删除上面的答案并给出新答案:-)。
你不能这样做两个查询吗?“搜索字段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
bnl4lu3b3#
我通过将group.filed和group.query组合在一起,成功地做到了这一点,如下所示:group.filed=myfield&group.query=-myfield:*结果是两个对象,您的字段和查询如下:
group.filed
group.filed=myfield&group.query=-myfield:*
{ responseHeader: { // }, grouped: { "myfield": { /// the data }, "-myfield:*": {/// the data}, } }
3条答案
按热度按时间lc8prwob1#
这是我能为我的问题找到的最佳答案(来自solr邮件列表用户):
其思想是使用字段Z的复制字段,并且在索引数据时,如果字段Z为空,则在复制字段中生成唯一值。分组时,使用复制字段而不是字段Z。(如果字段Z仅用于分组,则可以单独使用而不使用复制字段)。
cx6n0qe32#
您可以使用
group.query
和e1d1e来实现这一点。例如,下面的查询获取价格从0到10的所有文档,并按流行程度对结果进行分组。设置
group.query=popularity:[* TO *]
可确保受欢迎程度。制作group.main=true
可以确保团队。查询结果是主要结果。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建议我编辑答案,而不是删除上面的答案并给出新答案:-)。
你不能这样做两个查询吗?
“搜索字段X等于某个值的文档,并按字段Z对其进行分组(以便每个字段Z值只返回1个文档)”
我希望将字段Z为空的文档包含在结果中(全部),并按字段Y对结果进行排序
bnl4lu3b3#
我通过将
group.filed
和group.query
组合在一起,成功地做到了这一点,如下所示:group.filed=myfield&group.query=-myfield:*
结果是两个对象,您的字段和查询如下: