求和字段并在 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: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 查询。
请务必让我们知道您决定如何实施它。就像我说的,这是一个非常有趣的用例! :)
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 - 当前发布目标)。
我正在 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: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 查询。
请务必让我们知道您决定如何实施它。就像我说的,这是一个非常有趣的用例! :)
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 - 当前发布目标)。