Rank Fusion設定

概要

Fess のRank Fusion機能は、複数の検索結果を統合して より精度の高い検索結果を提供します。

Rank Fusionとは

Rank Fusionは、複数の検索アルゴリズムやスコアリング手法の結果を 組み合わせて、単一の最適化されたランキングを生成する技術です。

主な利点:

  • 異なるアルゴリズムの長所を組み合わせる

  • 検索精度の向上

  • 多様な検索結果の提供

対応アルゴリズム

Fess ではRRF(Reciprocal Rank Fusion)アルゴリズムをサポートしています。

RRF (Reciprocal Rank Fusion)

RRFは、各検索結果におけるドキュメントの順位の逆数を合計してスコアを計算します。 複数のサーチャーで取得されたドキュメントは、それぞれのスコアが加算されます。

計算式:

score(d) = Σ 1 / (k + rank(d))
  • k: 順位の影響度を調整する定数パラメーター(デフォルト: 20)

  • rank(d): 各検索結果におけるドキュメントdの順位(0始まり)

  • Σ: ドキュメントdが出現したすべてのサーチャーにわたる合計

設定

fess_config.properties

基本設定:

# ウィンドウサイズ(融合対象の結果数)
# 注: paging.search.page.max.size × 2 以上である必要があります。
# 設定値がこの最小値を下回る場合、最小値が自動的に使用されます。
rank.fusion.window_size=200

# RRFのrank_constant(kパラメーター)
rank.fusion.rank_constant=20

# 並列処理のスレッド数(0以下の場合、利用可能なCPUコア数 × 1.5 + 1 が使用されます)
rank.fusion.threads=-1

# スコアフィールド名(融合後のスコアを格納するフィールド)
rank.fusion.score_field=rf_score
プロパティ デフォルト 説明
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) に以下のように記述します:

# 使用するサーチャーの指定(カンマ区切り)
-Drank.fusion.searchers=default,semantic

このプロパティの動作は以下のとおりです:

  • 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.searcherssemantic を追加する必要があります。

使用例

基本的なハイブリッド検索

  1. キーワード検索でBM25スコアを計算

  2. セマンティック検索でベクトル類似度を計算

  3. RRFで両方の結果を融合

  4. 最終的なランキングを生成

検索フロー:

User Query
    ↓
┌──────────────────┬──────────────────┐
│  Keyword Search  │ Semantic Search  │
│    (BM25)        │  (Vector)        │
└────────┬─────────┴────────┬─────────┘
         ↓                  ↓
     Rank List 1        Rank List 2
         └────────┬─────────┘
                  ↓
          Rank Fusion (RRF)
                  ↓
          Final Ranking

パフォーマンス考慮事項

メモリ使用量

  • 複数の検索結果を保持するため、メモリ使用量が増加します。

  • rank.fusion.window_size で融合対象の最大件数を制限できます。メインサーチャー(先頭の default サーチャー)は最大で window_size 件、その他のサーチャーはそれぞれ window_size ÷ サーチャー数 件を取得します。

# 融合対象のウィンドウサイズ
rank.fusion.window_size=200

処理時間

  • 複数の検索を実行するため、レスポンス時間が増加します。

  • rank.fusion.threads で並列実行のスレッド数を設定します。

# 並列実行のスレッド数(0以下の場合、利用可能なCPUコア数 × 1.5 + 1)
rank.fusion.threads=-1

トラブルシューティング

検索結果が期待と異なる

症状: Rank Fusion後の結果が期待と異なる

確認事項:

  1. 各検索タイプの結果を個別に確認

  2. rank.fusion.rank_constant の値を調整

  3. rank.fusion.window_size の値を調整

  4. 深いページ(開始位置 × 2rank.fusion.window_size 以上になる位置)では融合が行われず、メインサーチャーのみで検索されます。より多くのページで融合結果を利用したい場合は rank.fusion.window_size を大きくしてください。

検索が遅い

症状: Rank Fusion有効時に検索が遅くなる

解決方法:

  1. rank.fusion.window_size を減らす:

    rank.fusion.window_size=100
    
  2. rank.fusion.threads を調整:

    rank.fusion.threads=4
    

メモリ不足

症状: OutOfMemoryError が発生する

解決方法:

  1. rank.fusion.window_size を減らす

  2. JVMヒープサイズを増やす

参考情報