折疊與展開結果

「折疊」查詢剖析器和「展開」元件結合在一起,形成一種在搜尋結果中將文件分組以進行欄位折疊的方法。

「折疊」查詢剖析器會根據您的參數將文件分組(折疊結果集),而「展開」元件則提供對折疊群組中文件的存取,供客戶端應用程式在結果顯示或其他處理中使用。折疊與展開可以一起執行舊版結果分組 (group=true) 針對大多數使用案例執行的功能,但並非所有案例都適用。啟用結果分組時,不支援折疊和展開。一般而言,您應該優先選擇折疊與展開。

為了在 SolrCloud 中使用這些功能,文件必須位於同一個分片上。為了確保文件共置,您可以在建立集合時將 router.name 參數定義為 compositeId。如需此選項的詳細資訊,請參閱文件路由章節。

折疊查詢剖析器

CollapsingQParser 實際上是一個後置篩選器,當結果集中不同群組的數量很高時,它可以提供比 Solr 標準方法更有效率的欄位折疊。此剖析器會先將結果集折疊為每個群組一個文件,然後再將結果集轉發給其餘的搜尋元件。因此,所有下游元件(分面、醒目提示等)都將使用折疊的結果集。

CollapsingQParserPlugin 完全支援 QueryElevationComponent。

折疊查詢剖析器選項

CollapsingQParser 接受下列本機參數

欄位

必要

預設值:無

要折疊的欄位。該欄位必須是單一值的字串、整數或浮點數類型欄位。

minmax

選用

預設值:無

根據具有指定數值欄位或函數查詢的最小值或最大值的文件,為每個群組選取群組標頭文件。

最多只能指定 minmaxsort(請參閱下方)參數其中之一。

如果未指定任何參數,則每個群組的群組標頭文件將根據該群組中得分最高的文件來選取。

sort

選用

預設值:無

根據依照指定排序字串排序後先出現的文件,為每個群組選取群組標頭文件。

最多只能指定 minmax(請參閱上方)或 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=expandnullPolicy=ignore,「折疊查詢剖析器」可以利用一個事實:具有相同欄位值的所有文件在索引中都彼此相鄰,位於單一巢狀文件「區塊」中。這使得折疊邏輯更快且更節省記憶體。

預設的折疊邏輯必須追蹤所有群組的頭部文件 — 對於到目前為止遇到的所有群組 — 直到它評估完所有文件,因為它考慮的每個文件都可能成為任何群組的新群組頭部。

然而,當在 _root_ 欄位上折疊時,邏輯知道,當它掃描索引時,它永遠不會遇到先前處理過的群組中的任何新文件。

這種更有效率的邏輯也可以透過 hint=block 本機參數與其他 collapseField 值一起使用。當您有深度巢狀文件,並且想要在一個欄位上折疊時,這非常有用,這個欄位對於具有通用 _root_ 的所有文件不包含相同的值,但對於通用 _root_ 下的一組連續文件而言,是一個唯一且相同的值。例如:搜尋「孫子」文件並在每個「子文件」唯一的欄位上折疊

當在每個連續的文件區塊中不是唯一欄位的欄位上折疊時,指定 hint=block 是不支援的,並且可能會以意想不到的方式失敗;包括靜默返回不正確結果的可能性。

該實作不提供針對在不受支援的欄位上濫用的任何安全措施,因為這樣做會需要與非區塊折疊實作相同的群組級別追蹤 — 破壞此最佳化的目的。

展開元件

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=collapsenullPolicy=expandcollapse;或透過 expand.q找到屬於此已展開群組的文件。