12

我的架构是这样的:

product_id  
category_id

一个类别包含产品。
在 solr 3.6 中,我将结果分组到 category_id 上,效果很好。

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

group_id

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

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

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

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

任何想法?

编辑:现在,我在 php 中处理结果以删除结果中已经存在 group_id 的文档。我让这个主题保持开放,以防有人发现如何在 2 个字段上分组

4

3 回答 3

9

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

&facet.pivot=category_id,group_id

facet_pivotSolr 将在元素下的搜索结果页面之后为您返回分组结果计数的层次结构。

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

于 2013-12-30T15:59:09.200 回答
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
于 2017-05-10T06:59:34.247 回答
2

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

于 2013-04-03T18:16:05.840 回答