Solr:我如何在两个不同的领域进行分组?

时间:2013-04-02 07:49:40

标签: solr

我的架构如下:

product_id  
category_id

类别包含产品 在solr 3.6中,我对category_id进行了分组,效果很好。

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

group_id

一组包含大小或颜色不同的产品 示例:蓝色,红色和黄色的鞋子是3种不同的产品,并且具有相同的group_id。

除了字段category_id的结果分组之外,我想在结果中只有一个group_id的产品,假设group_id可以为null(对于不属于某个组的产品)。

按照鞋子的例子,这意味着对于请求“鞋子”,3个产品中只有一个应该在结果中。

我想在group_id上进行第二次结果分组,但我似乎不可能这样做。

有什么想法吗?

编辑:目前,我在php中处理结果以删除具有已存在于结果中的group_id的文档。我打开这个主题,以防有人发现如何分组2个字段

3 个答案:

答案 0 :(得分:5)

如果您的目标是根据多个“分组依据”字段获取分组计数,则可以使用 pivot faceting 来实现此目的。

&facet.pivot=category_id,group_id

Solr将根据facet_pivot元素下的搜索结果页面返回分组结果计数的层次结构。

http://wiki.apache.org/solr/SimpleFacetParameters?highlight=%28pivot%29#Pivot_.28ie_Decision_Tree.29_Faceting

答案 1 :(得分: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 :(得分:2)

如果您可以更改要发布到solr的数据,那么我建议您创建一个字符串字段,该字段将具有category_id和group_id的串联。例如,如果category_id = 5且group_id = 2,那么您的字符串字段可以是: - '5,2'(使用','或任何其他字符作为分隔符)。然后,您可以对此字符串字段进行分组。