我正在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条答案
按热度按时间tgabmvqs1#
Solr 5.1+(和5.3)引入了Solr Facet functions来解决这个问题。
从特征的Yonik's introduction:
因此,建议升级到Solr的最新版本(最新版本目前是5.2.1,请注意,上述链接上的一些语法将在5.3中着陆-当前的发布目标)。
c2e8gylq2#
因此,您希望将结果分组到字段
parent_id
上,并在每个组中对字段valueToBeSummed
求和,然后按新的summedvalue
字段对整个结果(组)进行排序。这是一个非常有趣的用例...不幸的是,我不认为有一个内置的方式来做你所要求的。
您可以使用function queries进行排序,也可以使用group.func参数,但它们不会执行您所要求的操作。
您是否已经为这些数据编制了索引?或者您是否仍在制定如何存储这些数据的图表?如果是后者,则一种可能的方法是为每个文档设置一个
summedvalue
字段,并在为文档编制索引时计算该字段。例如,给定问题中的示例文档,第一个文档的索引将为在使用
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
相加,因此下一个文档的索引将为和/或其他信息。
一旦以这种方式对文档进行索引,就可以使用
&group=true&group.field=parent_id&sort=summedValue
运行常规solr查询。请让我们知道你决定如何实现它。就像我说的,这是一个非常有趣的用例!:)
dauxcl2d3#
您可以添加以下查询
您需要使用Stats Component来满足需求。您可以通过here获得更多信息。我们的想法是首先定义需要统计的内容。这里是valueToBeSummed,然后我们需要根据parent_id进行分组。我们使用facet.pivot来实现此功能。
关于排序,当我们进行分组时,默认的排序顺序是基于每个组中的计数。我们也可以基于值来定义。我已经使用facet.sort=index完成了上面的操作。所以它是基于parent_id排序的,这是我们用于分组的属性。但是您的要求是基于valueToBeSummed排序,这与分组属性不同。
到目前为止还不确定,如果我们能做到这一点。但会调查一下,让你知道。
简而言之,你得到了分组,你得到了上面的总和。只是排序待定