求和字段并在 Solr 上排序

Sum field and sort on Solr

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

你对此有什么建议吗?

您可以添加以下查询

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

您需要使用统计组件来满足要求。您可以获得更多信息here。这个想法首先定义你需要统计的内容。这里是valueToBeSummed,然后我们需要在parent_id上分组。我们使用 facet.pivot 来实现此功能。

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

目前还不确定我们能否实现。但会调查并告知您。

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

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

不幸的是,我认为没有内置的方法可以完成您的要求。

还有 function queries which you can use to sort, there is a 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:1valueToBeSummed of id:2 所以下一个文档将被索引为

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

等等。

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

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

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,请注意上面link的一些语法将登陆5.3 - 当前发布目标)。