【问题标题】:Sum field and sort on Solr求和字段并在 Solr 上排序
【发布时间】:2015-07-08 00:32:36
【问题描述】:

我正在 Solr 中实现分组搜索。我正在寻找一种对一个字段求​​和并按此总和对结果进行排序的方法。通过下面的数据示例,我希望它会更清楚。

{
  [
    {
      "id" : 1,
      "parent_id" : 22,
      "valueToBeSummed": 3
    },
    {
      "id" : 2,
      "parent_id" : 22,
      "valueToBeSummed": 1
    },
    {
      "id" : 3,
      "parent_id" : 33,
      "valueToBeSummed": 1
    },
    {
      "id" : 4,
      "parent_id" : 5,
      "valueToBeSummed": 21
    }
  ]
}

如果对我想要获取的数据进行搜索

{
  [
    {
      "numFound": 1,
      "summedValue" : 21,
      "parent_id" : 5
    },
    {
      "numFound": 2,
      "summedValue" : 4,
      "parent_id" : 22
    },
    {
      "numFound": 1,
      "summedValue" : 1,
      "parent_id" : 33
    }
  ]
}

您对此有什么建议吗?

【问题讨论】:

  • 分面函数是我的问题的解决方案,有了这个我可以按组对计算值(总和)的结果进行排序,分面结果有分页。

标签: sorting search solr grouping solarium


【解决方案1】:

Solr 5.1+(和 5.3)引入了Solr Facet functions 来解决这个确切的问题。

来自Yonik's introduction的功能:

$ curl http://localhost:8983/solr/query -d 'q=*:*&
 json.facet={
   categories:{
     type : terms,
     field : cat,
     sort : "x desc",   // can also use sort:{x:desc}
     facet:{
       x : "avg(price)",
       y : "sum(price)"
     }
   }
 }
'

所以建议升级到 Solr 的最新版本(最新版本目前是 5.2.1,请注意上述链接中的某些语法将在 5.3 中登陆 - 当前版本目标) .

【讨论】:

    【解决方案2】:

    因此,您希望在字段 parent_id 上对结果进行分组,并在每个组内对字段 valueToBeSummed 进行汇总,然后您希望通过这个新的 summedvalue 字段对整个结果(组)进行排序.这是一个非常有趣的用例……

    不幸的是,我不认为有一种内置的方式来做你所要求的。

    您可以使用function queries 进行排序,还有一个group.func 参数,但他们不会按照您的要求进行操作。

    您是否已经为这些数据编制了索引?还是您仍在研究如何存储这些数据?如果是后者,那么一种可能的方法是为每个文档设置一个 summedvalue 字段,并在文档被索引时计算它。例如,给定您问题中的示例文档,第一个文档将被索引为

    {
      "id" : 1,
      "parent_id" : 22,
      "valueToBeSummed": 3
      "summedvalue": 3
      "timestamp": current-timestamp
    },
    

    在使用parent_id:22 索引第二个文档id:2 之前,您将运行一个solr 查询以获取最后一个使用parent_id:22 索引的文档

    Solr 查询q=parent_id:22&sort=timestamp desc&rows=1

    并添加summedvalue of id:1 和valueToBeSummed of id:2 所以下一个文档将被索引为

    {
      "id" : 2,
      "parent_id" : 22,
      "valueToBeSummed": 1
      "summedvalue": 4
      "timestamp": current-timestamp
    }
    

    等等。

    以这种方式索引文档后,您可以使用&group=true&group.field=parent_id&sort=summedValue 运行常规 solr 查询。

    请让我们知道您决定如何实施它。就像我说的那样,它是一个非常有趣的用例! :)

    【讨论】:

    • 我想我必须像你说的那样实现一些东西,带有总和值的文档,我将在本周晚些时候提供反馈——谢谢——
    【解决方案3】:

    您可以添加以下查询

    select?q=*:*&stats=true&stats.field={!tag=piv1 sum=true}valueToBeSummed&facet=true&facet.pivot={!stats=piv1 facet.sort=index}parent_id&wt=json&indent=true
    

    您需要使用 Stats 组件来满足要求。您可以获取更多信息here。这个想法首先是定义你需要统计什么。这里是valueToBeSummed,然后我们需要对parent_id进行分组。我们使用 facet.pivot 来实现这个功能。

    关于排序,当我们进行分组时,默认的排序顺序是基于每个组中的计数。我们也可以根据值来定义。我在上面使用 facet.sort=index 完成了这个。所以它按照我们用于分组的 parent_id 排序。但是您的要求是对不同于分组属性的 valueToBeSummed 进行排序。

    目前还不确定,如果我们能做到这一点。但会调查并通知您。

    简而言之,你得到了分组,你得到了上面的总和。只是排序待处理

    【讨论】:

    • 如果您在 parent_id 字段上进行统计,根据相关示例文档,您可能会得到这样的回复 { stats_fields: { parent_id: { min: 5.0, max: 33.0, count: 4, missing: 0, sum: 82.0, ..... } } } OP 希望按 parent_id 分组,然后使用 sum 对组进行排序每个组内的一个字段。
    • @Ramzy 统计值是否允许对组进行排序?
    猜你喜欢
    • 2012-01-01
    • 2011-12-20
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多