Solr上的求和字段和排序

时间:2015-07-08 00:32:37

标签: sorting search solr grouping solarium

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




你对此有什么建议吗?

3 个答案:

答案 0 :(得分:4)

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中出现 - 当前发布目标)。

答案 1 :(得分:1)

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

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

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

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

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

在使用id:2索引第二个文档parent_id:22之前,您将运行一个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查询。

请告诉我们您是如何决定实施的。就像我说的一个非常有趣的用例! :)

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

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

截至目前尚不确定,如果我们能够做到这一点。但是会调查并让你知道。

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