对Solr字段求和并排序

ifsvaxew  于 2022-11-23  发布在  Solr
关注(0)|答案(3)|浏览(233)

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

你对此有什么建议吗?

tgabmvqs

tgabmvqs1#

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

c2e8gylq

c2e8gylq2#

因此,您希望将结果分组到字段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: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查询。
请让我们知道你决定如何实现它。就像我说的,这是一个非常有趣的用例!:)

dauxcl2d

dauxcl2d3#

您可以添加以下查询

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排序,这与分组属性不同。
到目前为止还不确定,如果我们能做到这一点。但会调查一下,让你知道。
简而言之,你得到了分组,你得到了上面的总和。只是排序待定

相关问题