[英]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 } ] }
你對此有什么建議嗎?
Solr 5.1+(和 5.3)引入了Solr Facet 函數來解決這個確切的問題。
$ 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 - 當前發布目標)。
因此,您希望在parent_id
字段上對結果進行分組,並在每個組內對valueToBeSummed
字段valueToBeSummed
,然后按此新summedvalue
字段對整個結果(組)進行排序。 這是一個非常有趣的用例......
不幸的是,我不認為有一種內置的方式來做你所要求的。
您可以使用函數查詢進行排序,還有一個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 查詢。
請務必讓我們知道您決定如何實施它。 就像我說的,這是一個非常有趣的用例! :)
您可以添加以下查詢
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 來滿足需求。 您可以在此處獲取更多信息。 這個想法首先定義您需要統計的內容。 這里是valueToBeSummed,然后我們需要對parent_id進行分組。 我們使用 facet.pivot 來實現此功能。
關於排序,當我們進行分組時,默認的排序順序是基於每個組中的計數。 我們也可以根據值來定義。 我在上面使用 facet.sort=index 完成了此操作。 所以它按 parent_id 排序,這是我們用於分組的那個。 但是您的要求是對 valueToBeSummed 進行排序,這與分組屬性不同。
目前還不確定,如果我們能做到這一點。 但會調查它並讓你知道。
簡而言之,你得到了分組,你得到了上面的總和。 只是排序待定
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.