【问题标题】:Solr : How can I group on two different fields?Solr:我如何在两个不同的领域进行分组?
【发布时间】:2017-05-10 14:59:34
【问题描述】:

我的架构是这样的:

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 个字段上分组

【问题讨论】:

标签: solr


【解决方案1】:

如果您的目标是根据多个“分组依据”字段获取分组计数,您可以使用 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

【讨论】:

  • 这正是我所需要的。从未听说过 facet.pivot。谢谢!
【解决方案2】:

不能按查询对两个字段进行分组。 如果您需要计数,则可以使用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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 聪明,但不适合我的情况。我想在 category_id 上分组,限制为 10000,然后在 group_id 上分组,限制为 1,因为每个 group_id 只需要返回 1 个文档。
    猜你喜欢
    • 2015-08-24
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多