Solr:如何在两个不同字段上分组?

12

我的模式如下:

product_id  
category_id

一个分类包含产品。
在solr 3.6中,我按category_id对结果进行分组,效果很好。

我刚刚添加了一个新字段:

group_id

一个分组包含不同大小或颜色的产品。
示例:蓝色、红色和黄色鞋子是三种不同的产品,但它们具有相同的group_id。

除了按category_id字段进行结果分组外,我希望在我的结果中只有一个group_id对应的产品,假设group_id可以为null(对于不属于任何分组的产品)。

以鞋子为例,对于请求"shoe",结果中应该只有其中一款鞋子。

我想过在group_id上进行第二次结果分组,但似乎无法实现这种方式。

有什么想法吗?

编辑:目前,我在php中处理结果以删除已经在结果中出现过的具有group_id的文档。我保留这个话题,以防有人找到如何在两个字段上进行分组的方法。


1
似乎很多人想要搜索这个。以下是一些内容,可能不反映Solr的最新技术:http://www.slideshare.net/MarkHarwood/proposal-for-nested-document-support-in-lucene http://blog.griddynamics.com/2011/07/solr-experience-search-parent-child.html - Jesvin Jose
3个回答

9

1
这正是我所需要的。从未听说过facet.pivot。谢谢! - mynameistechno

3

不可能在两个字段上进行分组查询。 如果您需要计数,则可以使用facet.field(对于单个字段)或facet.pivot(对于多个字段)。 实际上这并不是分组,但您可以获取多个字段的该组计数。

示例输出:

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <lst name="responseHeader">
        <bool name="zkConnected">true</bool>
        <int name="status">0</int>
        <int name="QTime">306</int>
    </lst>
    <result name="response" numFound="667" start="0" maxScore="0.70710677">
        <doc>
            <int name="idField">7393</int>
            <int name="field_one">12</int>
        </doc>
    </result>
    <lst name="facet_counts">
        <lst name="facet_queries"/>
        <lst name="facet_fields"/>
        <lst name="facet_ranges"/>
        <lst name="facet_intervals"/>
        <lst name="facet_heatmaps"/>
        <lst name="facet_pivot">
            <arr name="field_one,field_two">
                <lst>
                    <str name="field">field_one</str>
                    <int name="value">3</int>
                    <int name="count">562</int>
                    <arr name="pivot">
                        <lst>
                            <str name="field">field_two</str>
                            <bool name="value">true</bool>
                            <int name="count">347</int>
                        </lst>
                        <lst>
                            <str name="field">field_two</str>
                            <bool name="value">false</bool>
                            <int name="count">215</int>
                        </lst>
                    </arr>
                </lst>
                <lst>
                    <str name="field">field_one</str>
                    <int name="value">12</int>
                    <int name="count">105</int>
                    <arr name="pivot">
                        <lst>
                            <str name="field">field_two</str>
                            <bool name="value">true</bool>
                            <int name="count">97</int>
                        </lst>
                        <lst>
                            <str name="field">field_two</str>
                            <bool name="value">false</bool>
                            <int name="count">8</int>
                        </lst>
                    </arr>
                </lst>
            </arr>
        </lst>
    </lst>
</response>

示例查询:

http://192.168.100.145:7983/solr/<collection>/select?facet.pivot=field_one,field_two&facet=on&fl=idField,field_one&indent=on&q=field_one:(3%2012)&rows=1&wt=xml

2

如果你能够更改要提交给Solr的数据,我建议你创建一个字符串字段,该字段将连接类别ID和组ID。例如,如果类别ID = 5,组ID = 2,则你的字符串字段可以是:'5,2'(使用“,”或任何其他字符作为分隔符)。然后你可以在这个字符串字段上进行分组。


1
聪明,但不适合我的情况。我想按category_id分组,限制为10000,然后按group_id分组,限制为1,因为每个group_id只需要返回1个文档。 - Elodie

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