結果分組
結果分組將具有共同欄位值的文件分組,並傳回每個群組的頂端文件。
例如,如果您在電子零售商的電子商務網站上搜尋「DVD」,您可能會得到三個類別,例如「電視與影片」、「電影」和「電腦」,每個類別有三個結果。 在這種情況下,查詢詞「DVD」出現在所有三個類別中,因此 Solr 會將它們分組在一起,以提高使用者相關性。
優先選擇摺疊與展開
Solr 的摺疊與展開結果功能較新,且與結果分組大部分重疊。 兩者都有獨特的功能,且具有不同的效能特性。 也就是說,在大多數情況下,摺疊與展開比結果分組更為可取。 |
結果分組與分面分開。 雖然概念上相似,但分面會傳回所有相關結果,並允許使用者根據分面類別來篩選結果。 例如,如果您在鞋類零售商的電子商務網站上搜尋「鞋子」,Solr 會傳回該查詢詞的所有結果,以及可選的分面,例如「尺寸」、「顏色」、「品牌」等等。
不過,您可以將分組與分面結合。 分組的分面支援 facet.field
和 facet.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
。 它也必須是基於字串的欄位,例如StrField
或TextField
。 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
,則分組的文件會以單個平面列表呈現,而start
和rows
參數會影響文件的數量,而不是群組的數量。此參數的另一個值是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.field
、group.func
、group.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=1
和 group.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.ngroups
和group.facet
要求每個群組中的所有文件都必須位於同一分片上,才能傳回準確的計數。透過複合鍵的文件路由在許多情況下可能是一個有用的解決方案。