結果分組

結果分組將具有共同欄位值的文件分組,並傳回每個群組的頂端文件。

例如,如果您在電子零售商的電子商務網站上搜尋「DVD」,您可能會得到三個類別,例如「電視與影片」、「電影」和「電腦」,每個類別有三個結果。 在這種情況下,查詢詞「DVD」出現在所有三個類別中,因此 Solr 會將它們分組在一起,以提高使用者相關性。

優先選擇摺疊與展開

Solr 的摺疊與展開結果功能較新,且與結果分組大部分重疊。 兩者都有獨特的功能,且具有不同的效能特性。 也就是說,在大多數情況下,摺疊與展開比結果分組更為可取。

結果分組與分面分開。 雖然概念上相似,但分面會傳回所有相關結果,並允許使用者根據分面類別來篩選結果。 例如,如果您在鞋類零售商的電子商務網站上搜尋「鞋子」,Solr 會傳回該查詢詞的所有結果,以及可選的分面,例如「尺寸」、「顏色」、「品牌」等等。

不過,您可以將分組與分面結合。 分組的分面支援 facet.fieldfacet.range,但目前不支援日期和樞紐分面。 分面計數是根據第一個 group.field 參數計算,而其他 group.field 參數則會被忽略。

分組的分面與非分組的分面不同 (所有分面的總和) == (具有該屬性的產品總數),如下列範例所示

物件 1

  • 名稱:Phaser 4620a

  • ppm:62

  • 產品範圍:6

物件 2

  • 名稱:Phaser 4620i

  • ppm:65

  • 產品範圍:6

物件 3

  • 名稱:ML6512

  • ppm:62

  • 產品範圍:7

如果您要求 Solr 依「product_range」分組這些文件,則群組總數為 2,但 ppm 的分面為 62 的 2 和 65 的 1。

分組參數

結果分組採用下列請求參數。 單一請求中可以包含任意數量的這些請求參數

group

選用

預設值:false

如果為 true,則會將查詢結果分組。

group.field

選用

預設值:無

要依其分組結果的欄位名稱。 該欄位必須是單一值,而且是已編製索引,或是具有值來源且可在函數查詢中運作的欄位類型,例如 ExternalFileField。 它也必須是基於字串的欄位,例如 StrFieldTextField

group.func

選用

預設值:無

依函數查詢的唯一值分組。

此選項不適用於分散式搜尋
group.query

選用

預設值:無

傳回符合指定查詢的單一群組文件。

rows

選用

預設值:10

要傳回的群組數量。

start

選用

預設值:無

指定群組列表的初始偏移量。

group.limit

選用

預設值:1

指定每個群組要傳回的結果數量。

group.offset

選用

預設值:無

指定每個群組的文件列表的初始偏移量。

sort

選用

預設值:score desc

指定 Solr 如何對群組進行彼此之間的排序。例如,sort=popularity desc 將會根據每個群組中人氣最高的文件的排序群組。

group.sort

選用

預設值:請參閱說明

指定 Solr 如何排序每個群組內的文件。如果未指定 group.sort,則預設行為是使用與 sort 參數相同的有效值。

group.format

選用

預設值:grouped

如果此參數設定為 simple,則分組的文件會以單個平面列表呈現,而 startrows 參數會影響文件的數量,而不是群組的數量。此參數的另一個值是 grouped

group.main

選用

預設值:無

如果為 true,則第一個欄位分組命令的結果會被用作回應中的主要結果列表,使用 group.format=simple

group.ngroups

選用

預設值:false

如果為 true,Solr 會在結果中包含符合查詢的群組數量。

使用分片索引時,請參閱下方的分散式結果分組注意事項

group.truncate

選用

預設值:false

如果為 true,則 facet 計數會基於每個符合查詢的群組中最相關的文件。

group.facet

選用

預設值:false

決定是否計算在 facet.field 參數中指定的欄位 facet 的分組 facet。分組 facet 是根據第一個指定的分組計算的。與普通欄位分面一樣,欄位不應被標記化(否則會針對每個標記計算計數)。分組 facet 支援單值和多值欄位。

此選項可能會有很高的效能成本。

使用分片索引時,請參閱下方的分散式結果分組注意事項

group.cache.percent

選用

預設值:0

將此參數設定為大於 0 的數字會啟用結果分組的快取。結果分組執行兩個搜尋;此選項會快取第二個搜尋。

測試表明,群組快取僅在使用布林值、萬用字元和模糊查詢時才能改善搜尋時間。對於簡單的查詢(例如術語或「符合所有」查詢),群組快取會降低效能。

可以在單個請求中指定任意數量的群組命令(例如,group.fieldgroup.funcgroup.query 等)。

分組範例

以下所有範例查詢都適用於 Solr 的「bin/solr start -e techproducts」範例。

依欄位分組結果

在此範例中,我們將基於 manu_exact 欄位對結果進行分組,該欄位指定範例資料集中項目的製造商。

https://127.0.0.1:8983/solr/techproducts/select?fl=id,name&q=solr+memory&group=true&group.field=manu_exact
{
"..."
"grouped":{
  "manu_exact":{
    "matches":6,
    "groups":[{
        "groupValue":"Apache Software Foundation",
        "doclist":{"numFound":1,"start":0,"docs":[
            {
              "id":"SOLR1000",
              "name":"Solr, the Enterprise Search Server"}]
        }},
      {
        "groupValue":"Corsair Microsystems Inc.",
        "doclist":{"numFound":2,"start":0,"docs":[
            {
              "id":"VS1GB400C3",
              "name":"CORSAIR ValueSelect 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - Retail"}]
        }},
      {
        "groupValue":"A-DATA Technology Inc.",
        "doclist":{"numFound":1,"start":0,"docs":[
            {
              "id":"VDBDB1A16",
              "name":"A-DATA V-Series 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - OEM"}]
        }},
      {
        "groupValue":"Canon Inc.",
        "doclist":{"numFound":1,"start":0,"docs":[
            {
              "id":"0579B002",
              "name":"Canon PIXMA MP500 All-In-One Photo Printer"}]
        }},
      {
        "groupValue":"ASUS Computer Inc.",
        "doclist":{"numFound":1,"start":0,"docs":[
            {
              "id":"EN7800GTX/2DHTV/256M",
              "name":"ASUS Extreme N7800GTX/2DHTV (256 MB)"}]
        }
      }]}}}

回應指出我們的查詢總共有六個符合項。對於每個 group.field 的五個唯一值,Solr 會為該 groupValue 傳回一個 docList,使得 numFound 指示該群組中文件的總數,並且根據隱式預設 group.limit=1group.sort=score desc 參數傳回最上面的文件。然後,根據每個群組中頂部文件的分數,根據隱式 sort=score desc 對結果群組進行排序,並且傳回的群組數量限制為隱式 rows=10

我們可以執行相同的查詢並使用請求參數 group.main=true。這會將結果格式化為單個平面文件列表。此平面格式不包含與普通結果分組查詢結果一樣多的資訊(特別是每個群組中的 numFound),但現有的 Solr 用戶端可能更容易解析。

https://127.0.0.1:8983/solr/techproducts/select?fl=id,name,manufacturer&q=solr+memory&group=true&group.field=manu_exact&group.main=true
{
  "responseHeader":{
    "status":0,
    "QTime":1,
    "params":{
      "fl":"id,name,manufacturer",
      "indent":"true",
      "q":"solr memory",
      "group.field":"manu_exact",
      "group.main":"true",
      "group":"true"}},
  "grouped":{},
  "response":{"numFound":6,"start":0,"docs":[
      {
        "id":"SOLR1000",
        "name":"Solr, the Enterprise Search Server"},
      {
        "id":"VS1GB400C3",
        "name":"CORSAIR ValueSelect 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - Retail"},
      {
        "id":"VDBDB1A16",
        "name":"A-DATA V-Series 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - OEM"},
      {
        "id":"0579B002",
        "name":"Canon PIXMA MP500 All-In-One Photo Printer"},
      {
        "id":"EN7800GTX/2DHTV/256M",
        "name":"ASUS Extreme N7800GTX/2DHTV (256 MB)"}]
  }
}

依查詢分組

在此範例中,我們將使用 group.query 參數來尋找「memory」在兩個不同價格範圍內的前三個結果:0.00 到 99.99,以及超過 100。

https://127.0.0.1:8983/solr/techproducts/select?indent=true&fl=name,price&q=memory&group=true&group.query=price:[0+TO+99.99]&group.query=price:[100+TO+*]&group.limit=3
{
  "responseHeader":{
    "status":0,
    "QTime":42,
    "params":{
      "fl":"name,price",
      "indent":"true",
      "q":"memory",
      "group.limit":"3",
      "group.query":["price:[0 TO 99.99]",
      "price:[100 TO *]"],
      "group":"true"}},
  "grouped":{
    "price:[0 TO 99.99]":{
      "matches":5,
      "doclist":{"numFound":1,"start":0,"docs":[
          {
            "name":"CORSAIR ValueSelect 1GB 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) System Memory - Retail",
            "price":74.99}]
      }},
    "price:[100 TO *]":{
      "matches":5,
      "doclist":{"numFound":3,"start":0,"docs":[
          {
            "name":"CORSAIR  XMS 2GB (2 x 1GB) 184-Pin DDR SDRAM Unbuffered DDR 400 (PC 3200) Dual Channel Kit System Memory - Retail",
            "price":185.0},
          {
            "name":"Canon PIXMA MP500 All-In-One Photo Printer",
            "price":179.99},
          {
            "name":"ASUS Extreme N7800GTX/2DHTV (256 MB)",
            "price":479.95}]
      }
    }
  }
}

在這種情況下,Solr 找到了五個「memory」的匹配項,但僅傳回了四個按價格分組的結果。這是因為「memory」的一個結果沒有分配價格。

分散式結果分組注意事項

對於分散式搜尋支援分組,但有一些注意事項

  • 目前,任何分散式搜尋都不支援 group.func

  • group.ngroupsgroup.facet 要求每個群組中的所有文件都必須位於同一分片上,才能傳回準確的計數。透過複合鍵的文件路由在許多情況下可能是一個有用的解決方案。