結果の折りたたみと展開
Collapsing クエリパーサと Expand コンポーネントを組み合わせることで、検索結果におけるフィールド折りたたみのためのドキュメントグループ化アプローチが実現します。
Collapsing クエリパーサは、パラメータに従ってドキュメントをグループ化し(結果セットを折りたたみ)、Expand コンポーネントは折りたたまれたグループ内のドキュメントにアクセスできるようにして、クライアントアプリケーションによる結果表示やその他の処理に使用できるようにします。 Collapse & Expand は、以前の結果グループ化(group=true
)がほとんどのユースケースで実行していたことを、すべてではないものの、実行できます。結果グループ化が有効になっている場合、Collapse と Expand はサポートされていません。一般的には、Collapse & Expand を優先する必要があります。
SolrCloud でこれらの機能を使用するには、ドキュメントが同じシャードに存在する必要があります。ドキュメントの配置を保証するには、コレクションの作成時に |
Collapsing クエリパーサ
CollapsingQParser
は、結果セット内の異なるグループの数が非常に多い場合、Solr の標準的なアプローチよりもパフォーマンスの高いフィールド折りたたみを提供する、実際にはポストフィルタです。このパーサは、結果セットをグループごとに1つのドキュメントに折りたたんでから、結果セットを他の検索コンポーネントに転送します。そのため、ダウンストリームのコンポーネント(ファセッティング、ハイライト表示など)は、折りたたまれた結果セットで動作します。
CollapsingQParserPlugin は、QueryElevationComponent を完全にサポートしています。
Collapsing クエリパーサのオプション
CollapsingQParser は、次のローカルパラメータを受け入れます。
field
-
必須
デフォルト:なし
折りたたまれるフィールド。このフィールドは、単一値の文字列、整数、または浮動小数点型のフィールドである必要があります。
min
またはmax
-
オプション
デフォルト:なし
指定された数値フィールドまたは関数クエリの値が最小または最大であるドキュメントに基づいて、各グループのグループヘッドドキュメントを選択します。
min
、max
、sort
(下記参照)パラメータのうち、指定できるのは高々1つだけです。いずれも指定されていない場合、各グループのグループヘッドドキュメントは、そのグループで最もスコアの高いドキュメントに基づいて選択されます。
sort
-
オプション
デフォルト:なし
指定されたソート文字列に従って最初に来るドキュメントに基づいて、各グループのグループヘッドドキュメントを選択します。
min
、max
(上記参照)、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_
の下にある連続するドキュメントのセットに対して一意かつ同一の値であるフィールドで折りたたむ必要がある場合に役立ちます。例:「孫」ドキュメントを検索し、「子ドキュメント」ごとに一意のフィールドで折りたたみます。
連続したドキュメントブロックごとに一意ではないフィールドで 実装では、サポートされていないフィールドでの誤用に対する保護策は提供されていません。これは、非ブロック折りたたみ実装と同じグループレベルの追跡が必要になるため、この最適化の目的を損なうためです。 |
展開コンポーネント
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
を使用します)。そしてこの展開されたグループに属するドキュメントが見つかります。