折疊與展開結果
「折疊」查詢剖析器和「展開」元件結合在一起,形成一種在搜尋結果中將文件分組以進行欄位折疊的方法。
「折疊」查詢剖析器會根據您的參數將文件分組(折疊結果集),而「展開」元件則提供對折疊群組中文件的存取,供客戶端應用程式在結果顯示或其他處理中使用。折疊與展開可以一起執行舊版結果分組 (group=true
) 針對大多數使用案例執行的功能,但並非所有案例都適用。啟用結果分組時,不支援折疊和展開。一般而言,您應該優先選擇折疊與展開。
為了在 SolrCloud 中使用這些功能,文件必須位於同一個分片上。為了確保文件共置,您可以在建立集合時將 |
折疊查詢剖析器
CollapsingQParser
實際上是一個後置篩選器,當結果集中不同群組的數量很高時,它可以提供比 Solr 標準方法更有效率的欄位折疊。此剖析器會先將結果集折疊為每個群組一個文件,然後再將結果集轉發給其餘的搜尋元件。因此,所有下游元件(分面、醒目提示等)都將使用折疊的結果集。
CollapsingQParserPlugin 完全支援 QueryElevationComponent。
折疊查詢剖析器選項
CollapsingQParser 接受下列本機參數
欄位
-
必要
預設值:無
要折疊的欄位。該欄位必須是單一值的字串、整數或浮點數類型欄位。
min
或max
-
選用
預設值:無
根據具有指定數值欄位或函數查詢的最小值或最大值的文件,為每個群組選取群組標頭文件。
最多只能指定
min
、max
或sort
(請參閱下方)參數其中之一。如果未指定任何參數,則每個群組的群組標頭文件將根據該群組中得分最高的文件來選取。
sort
-
選用
預設值:無
根據依照指定排序字串排序後先出現的文件,為每個群組選取群組標頭文件。
最多只能指定
min
、max
(請參閱上方)或sort
參數其中之一。如果未指定任何參數,則每個群組的群組標頭文件將根據該群組中得分最高的文件來選取。
nullPolicy
-
選用
預設值:
ignore
有三種可用的 null 政策
-
ignore
:移除折疊欄位中具有 null 值的文件。 -
expand
:將折疊欄位中具有 null 值的每個文件視為個別群組。 -
collapse
:使用最高得分或最小值/最大值,將所有在折疊欄位中具有 null 值的文件折疊成單一群組。
-
hint
-
選用
預設值:無
有兩個可用的提示選項
-
top_fc
:這代表最上層 FieldCache。top_fc
提示僅在針對字串欄位進行折疊時可用。top_fc
通常會提供最佳的查詢時間速度,但在啟動或提交後需要最長的時間來預熱。如果將top_fc
用於分面或排序,也會導致折疊欄位在記憶體中快取兩次。對於非常高基數(高不同計數)的欄位,top_fc
可能無法順利運作。 -
block
:這表示要折疊的欄位適用於下方說明的最佳化區塊折疊邏輯。
-
大小
-
選用
預設值:
100000
設定僅在數值欄位上執行折疊時,折疊資料結構的初始大小。
當在數值欄位上執行折疊時,用於折疊的資料結構會動態增長。將大小設定為高於結果集中預期的結果數量,將可消除調整大小的成本。
collectElevatedDocsWhenCollapsing
-
選用
預設值:
true
與 折疊查詢剖析器 結合使用時,所有提升的文件都會在結果集的開頭顯示。如果此參數為
false
,則如果提升的文件具有相同的折疊鍵,則只會顯示代表文件。
範例用法語法
在 group_field
上折疊,選擇每個群組中得分最高的文件
fq={!collapse field=group_field}
在 group_field
上折疊,選擇每個群組中 numeric_field
的值最小的文件
fq={!collapse field=group_field min=numeric_field}
在 group_field
上折疊,選擇每個群組中 numeric_field
的值最大的文件
fq={!collapse field=group_field max=numeric_field}
在 group_field
上折疊,選擇每個群組中函數值最大的文件。請注意,cscore() 函數可與 min/max 選項一起使用,以使用目前正在折疊的文件分數。
fq={!collapse field=group_field max=sum(cscore(),numeric_field)}
在 group_field
上折疊,並使用 null 原則,以便所有在 group_field
中沒有值的文件都將被視為單一群組。對於每個群組,選定的文件將首先基於 numeric_field
,但平手將由分數打破。
fq={!collapse field=group_field nullPolicy=collapse sort='numeric_field asc, score desc'}
在 group_field
上折疊,並提示使用頂層欄位快取
fq={!collapse field=group_field hint=top_fc}
使用預設值為 100
的自訂 cost
進行折疊
fq={!collapse cost=1000 field=group_field}
區塊折疊
當在 _root_
欄位上折疊時,使用 nullPolicy=expand
或 nullPolicy=ignore
,「折疊查詢剖析器」可以利用一個事實:具有相同欄位值的所有文件在索引中都彼此相鄰,位於單一巢狀文件「區塊」中。這使得折疊邏輯更快且更節省記憶體。
預設的折疊邏輯必須追蹤所有群組的頭部文件 — 對於到目前為止遇到的所有群組 — 直到它評估完所有文件,因為它考慮的每個文件都可能成為任何群組的新群組頭部。
然而,當在 _root_
欄位上折疊時,邏輯知道,當它掃描索引時,它永遠不會遇到先前處理過的群組中的任何新文件。
這種更有效率的邏輯也可以透過 hint=block
本機參數與其他 collapseField
值一起使用。當您有深度巢狀文件,並且想要在一個欄位上折疊時,這非常有用,這個欄位對於具有通用 _root_
的所有文件不包含相同的值,但對於通用 _root_
下的一組連續文件而言,是一個唯一且相同的值。例如:搜尋「孫子」文件並在每個「子文件」唯一的欄位上折疊
當在每個連續的文件區塊中不是唯一欄位的欄位上折疊時,指定 該實作不提供針對在不受支援的欄位上濫用的任何安全措施,因為這樣做會需要與非區塊折疊實作相同的群組級別追蹤 — 破壞此最佳化的目的。 |
展開元件
ExpandComponent 可用於展開由 CollapsingQParserPlugin 折疊的群組。
搭配 CollapsingQParserPlugin 的範例用法
q=foo&fq={!collapse field=ISBN}
在上面的查詢中,CollapsingQParserPlugin 將在 *ISBN* 欄位上折疊搜尋結果。主要的搜尋結果將包含每本書中排名最高的文件。
現在可以使用 ExpandComponent 來展開結果,以便您可以查看按 ISBN 分組的文件。例如
q=foo&fq={!collapse field=ISBN}&expand=true
當與 CollapsingQParserPlugin 一起使用時,並且有多個折疊群組時,欄位是從成本最低的群組中選取的。如果有多个成本相同的折叠组,则选择第一个指定的折叠组。 |
啟用後,ExpandComponent 會在搜尋輸出中新增一個標示為 expanded
的新區段。
在 expanded
區段中,有一個地圖,其中每個群組的頭部都指向群組內已展開的文件。當應用程式迭代主要折疊結果集時,它們可以存取 expanded 地圖以檢索已展開的群組。
ExpandComponent 具有以下參數
expand
-
必要
預設值:無
當
true
時,會啟用 ExpandComponent。 expand.field
-
選用
預設值:無
需要填入展開文件的欄位。當
expand=true
時,必須指定此參數,或應與 CollapsingQParserPlugin 一起使用。當兩者都指定時,此參數具有較高的優先權。 expand.sort
-
選用
預設值:
score desc
排序已展開群組中的文件。
expand.rows
-
選用
預設值:
5
每個群組中要顯示的列數。
當
expand.rows=0
時,只會傳回每個展開值找到的文件數量。因此,即使要求也不會計算分數,且maxScore
會設定為 0。 expand.q
-
選用
預設值:無
覆寫主要查詢 (
q
),決定要將哪些文件包含在主要群組中。預設值是使用主要查詢。 expand.fq
-
選用
預設值:無
覆寫主要篩選查詢 (
fq
),決定要將哪些文件包含在主要群組中。預設值是使用主要篩選查詢。 expand.nullGroup
-
選用
預設值:
false
指示是否可以傳回包含在展開欄位中沒有值的文件之已展開群組。此選項僅啟用傳回「null」已展開群組的支援。與所有已展開群組一樣,它只會在主要群組包含對應文件以供其展開時存在(透過使用
nullPolicy=collapse
或nullPolicy=expand
的collapse
;或透過expand.q
)且找到屬於此已展開群組的文件。