簡體   English   中英

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

你對此有什么建議嗎?

Solr 5.1+(和 5.3)引入了Solr Facet 函數來解決這個確切的問題。

來自Yonik對該功能的介紹

$ 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: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 查詢。

請務必讓我們知道您決定如何實施它。 就像我說的,這是一個非常有趣的用例! :)

您可以添加以下查詢

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM