概要
Fess のRank Fusion機能は、複数の検索結果を統合して より精度の高い検索結果を提供します。
Rank Fusionとは
Rank Fusionは、複数の検索アルゴリズムやスコアリング手法の結果を 組み合わせて、単一の最適化されたランキングを生成する技術です。
主な利点:
異なるアルゴリズムの長所を組み合わせる
検索精度の向上
多様な検索結果の提供
対応アルゴリズム
Fess ではRRF(Reciprocal Rank Fusion)アルゴリズムをサポートしています。
RRF (Reciprocal Rank Fusion)
RRFは、各検索結果におけるドキュメントの順位の逆数を合計してスコアを計算します。 複数のサーチャーで取得されたドキュメントは、それぞれのスコアが加算されます。
計算式:
k: 順位の影響度を調整する定数パラメーター(デフォルト: 20)rank(d): 各検索結果におけるドキュメントdの順位(0始まり)Σ: ドキュメントdが出現したすべてのサーチャーにわたる合計
設定
fess_config.properties
基本設定:
| プロパティ | デフォルト | 説明 |
|---|---|---|
rank.fusion.window_size | 200 | 融合対象として各サーチャーから取得する結果の最大件数。paging.search.page.max.size × 2``(デフォルトでは ``200)以上である必要があり、下回る場合はこの最小値に自動的に引き上げられます。 |
rank.fusion.rank_constant | 20 | RRF計算式における定数 k。値を大きくすると、上位と下位の順位の差によるスコア差が小さくなります。 |
rank.fusion.threads | -1 | 複数サーチャーを並列実行する際のスレッド数。0 以下を指定すると 利用可能なCPUコア数 × 1.5 + 1 が自動的に使用されます。 |
rank.fusion.score_field | rf_score | 融合後のスコアを格納する結果ドキュメントのフィールド名。 |
JVMシステムプロパティ
使用するサーチャーは、JVMシステムプロパティで指定します。 fess.in.sh (または fess.in.bat) に以下のように記述します:
このプロパティの動作は以下のとおりです:
fess_config.propertiesではなく、JVMオプションとして設定します。defaultは標準のキーワード検索を行うサーチャーで、常に利用できます。semanticはセマンティック検索(ベクトル検索)を行うサーチャーで、Semantic Searchプラグイン(fess-webapp-semantic-search)を導入した場合に利用できます。このプロパティを指定しない場合は、登録されているすべてのサーチャーが使用されます。指定した名前がいずれのサーチャーにも一致しない場合は、
defaultサーチャーのみが使用されます。Rank Fusionによる結果の融合は、利用可能なサーチャーが2つ以上ある場合に実行されます。サーチャーが1つだけの場合は、融合は行われず通常の検索結果が返されます。
ハイブリッド検索との連携
Rank Fusionは、キーワード検索とセマンティック検索を組み合わせた ハイブリッド検索で特に効果を発揮します。 セマンティック検索を利用するには、Semantic Searchプラグイン(fess-webapp-semantic-search)を導入し、 -Drank.fusion.searchers に semantic を追加する必要があります。
使用例
基本的なハイブリッド検索
キーワード検索でBM25スコアを計算
セマンティック検索でベクトル類似度を計算
RRFで両方の結果を融合
最終的なランキングを生成
検索フロー:
パフォーマンス考慮事項
メモリ使用量
複数の検索結果を保持するため、メモリ使用量が増加します。
rank.fusion.window_sizeで融合対象の最大件数を制限できます。メインサーチャー(先頭のdefaultサーチャー)は最大でwindow_size件、その他のサーチャーはそれぞれwindow_size ÷ サーチャー数件を取得します。
処理時間
複数の検索を実行するため、レスポンス時間が増加します。
rank.fusion.threadsで並列実行のスレッド数を設定します。
トラブルシューティング
検索結果が期待と異なる
症状: Rank Fusion後の結果が期待と異なる
確認事項:
各検索タイプの結果を個別に確認
rank.fusion.rank_constantの値を調整rank.fusion.window_sizeの値を調整深いページ(
開始位置 × 2がrank.fusion.window_size以上になる位置)では融合が行われず、メインサーチャーのみで検索されます。より多くのページで融合結果を利用したい場合はrank.fusion.window_sizeを大きくしてください。
検索が遅い
症状: Rank Fusion有効時に検索が遅くなる
解決方法:
rank.fusion.window_sizeを減らす:rank.fusion.threadsを調整:
メモリ不足
症状: OutOfMemoryError が発生する
解決方法:
rank.fusion.window_sizeを減らすJVMヒープサイズを増やす
参考情報
スクリプティング概要 - スクリプティング概要
検索関連の設定 - 検索の詳細設定
LLM統合の概要 - LLM統合ガイド(セマンティック検索)