結果の折りたたみと展開

Collapsing クエリパーサと Expand コンポーネントを組み合わせることで、検索結果におけるフィールド折りたたみのためのドキュメントグループ化アプローチが実現します。

Collapsing クエリパーサは、パラメータに従ってドキュメントをグループ化し(結果セットを折りたたみ)、Expand コンポーネントは折りたたまれたグループ内のドキュメントにアクセスできるようにして、クライアントアプリケーションによる結果表示やその他の処理に使用できるようにします。 Collapse & Expand は、以前の結果グループ化(group=true)がほとんどのユースケースで実行していたことを、すべてではないものの、実行できます。結果グループ化が有効になっている場合、Collapse と Expand はサポートされていません。一般的には、Collapse & Expand を優先する必要があります。

SolrCloud でこれらの機能を使用するには、ドキュメントが同じシャードに存在する必要があります。ドキュメントの配置を保証するには、コレクションの作成時にrouter.nameパラメータをcompositeIdとして定義できます。このオプションの詳細については、ドキュメントルーティングセクションを参照してください。

Collapsing クエリパーサ

CollapsingQParserは、結果セット内の異なるグループの数が非常に多い場合、Solr の標準的なアプローチよりもパフォーマンスの高いフィールド折りたたみを提供する、実際にはポストフィルタです。このパーサは、結果セットをグループごとに1つのドキュメントに折りたたんでから、結果セットを他の検索コンポーネントに転送します。そのため、ダウンストリームのコンポーネント(ファセッティング、ハイライト表示など)は、折りたたまれた結果セットで動作します。

CollapsingQParserPlugin は、QueryElevationComponent を完全にサポートしています。

Collapsing クエリパーサのオプション

CollapsingQParser は、次のローカルパラメータを受け入れます。

field

必須

デフォルト:なし

折りたたまれるフィールド。このフィールドは、単一値の文字列、整数、または浮動小数点型のフィールドである必要があります。

minまたはmax

オプション

デフォルト:なし

指定された数値フィールドまたは関数クエリの値が最小または最大であるドキュメントに基づいて、各グループのグループヘッドドキュメントを選択します。

minmaxsort(下記参照)パラメータのうち、指定できるのは高々1つだけです。

いずれも指定されていない場合、各グループのグループヘッドドキュメントは、そのグループで最もスコアの高いドキュメントに基づいて選択されます。

sort

オプション

デフォルト:なし

指定されたソート文字列に従って最初に来るドキュメントに基づいて、各グループのグループヘッドドキュメントを選択します。

minmax(上記参照)、sortパラメータのうち、最大で1つのみを指定できます。

いずれも指定されていない場合、各グループのグループヘッドドキュメントは、そのグループで最もスコアの高いドキュメントに基づいて選択されます。

nullPolicy

オプション

デフォルト:ignore

3つのnullポリシーを使用できます。

  • ignore: collapseフィールドにnull値を持つドキュメントを削除します。

  • expand: collapseフィールドにnull値を持つ各ドキュメントを個別のグループとして扱います。

  • collapse: null値を持つすべてのドキュメントを、最高スコア、最小値/最大値のいずれかを使用して単一のグループに折りたたみます。

hint

オプション

デフォルト:なし

2つのヒントオプションがあります。

  • top_fc:最上位FieldCacheを表します。

    top_fcヒントは、文字列フィールドを折りたたむ場合にのみ使用できます。top_fcは通常、最速のクエリ時間を実現しますが、起動時またはコミット後のウォームアップに最も時間がかかります。ファセットまたはソートに使用される場合、top_fcは折りたたみフィールドをメモリに2回キャッシュすることにもなります。非常に高いカーディナリティ(異なるカウントが多い)のフィールドの場合、top_fcはそれほどうまく機能しない可能性があります。

  • block:折りたたまれているフィールドが、下記で説明されている最適化されたブロック折りたたみロジックに適していることを示します。

size

オプション

デフォルト: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で折りたたみます。 min/maxオプションでは、折りたたまれている現在のドキュメントのスコアを使用するためにcscore()関数を用いることができます。

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_フィールドで折りたたむ場合、ロジックはインデックスをスキャンする際に、以前に処理したグループに新しいドキュメントが決して見つからないことを認識しています。

このより効率的なロジックは、他のcollapseField値でも、hint=blockローカルパラメータを介して使用できます。これは、深くネストされたドキュメントがあり、共通の_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=collapseまたはnullPolicy=expandを使用してcollapseを使用するか、expand.qを使用します)。そしてこの展開されたグループに属するドキュメントが見つかります。