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

你对此有什么建议吗?
答案 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进行排序,该值与分组属性不同。
截至目前尚不确定,如果我们能够做到这一点。但是会调查并让你知道。
简而言之,你得到了分组,你得到了上面的总和。只是排序等待