1

我正在 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
    }
  ]
}

你对此有什么建议吗?

4

3 回答 3

3

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

来自Yonik 对该功能的介绍

$ 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 中登陆 - 当前的发布目标)。

于 2015-07-10T07:06:31.953 回答
0

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

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

您可以使用函数查询进行排序,还有一个group.func参数,但它们不会按照您的要求执行。

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

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

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

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

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

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

等等。

以这种方式索引文档后,您可以使用&group=true&group.field=parent_id&sort=summedValue.

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

于 2015-07-08T09:07:56.677 回答
-1

您可以添加以下查询

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 组件来满足要求。您可以在此处获得更多信息。这个想法首先是定义你需要统计什么。这里是valueToBeSummed,然后我们需要对parent_id进行分组。我们使用 facet.pivot 来实现这个功能。

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

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

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

于 2015-07-08T04:12:05.313 回答