すべてのプロダクト
Search
ドキュメントセンター

OpenSearch:Cava でのソートスクリプトの作成

最終更新日:Apr 01, 2026

Cava ソートスクリプトを使用すると、OpenSearch の高度ソートでカスタムのスコアリングロジックを実装できます。ソート式とは異なり、Cava スクリプトでは完全なプログラムによる制御が可能です。OpenSearch ライブラリの呼び出し、ドキュメントフィールドへのアクセス、クエリパラメーターの読み取りを行い、ビジネス要件に応じた任意のスコアリング数式を構築できます。

注: Cava ソートスクリプトは高度ソートにのみ適用され、基本ソートには適用されません。ソートスクリプトの作成と管理の概要については、ソートスクリプトの API リファレンスをご参照ください。コマンドラインインターフェイス (CLI) を使用してスクリプトを作成するには、「SortScript を使用したソートスクリプトの作成」をご参照ください。

仕組み

各検索リクエストに対して、OpenSearch は 2 つのフェーズでソートスクリプトを実行します:

  1. 初期化フェーズ — OpenSearch は、検索リクエストごとに init() を 1 回呼び出して、リクエストレベルの状態を設定します: スクリプトが必要とする属性フィールドを宣言し、スコアリング機能を初期化し、クエリパラメーターを読み取ります。

  2. スコア位相 — OpenSearch は、高度ソートにおける各候補ドキュメントに対して score() を 1 回呼び出して、そのドキュメントのスコアを計算します。その後、ドキュメントはスコアに基づいて順位付けされます。

init() が失敗した場合、OpenSearch はエラーを返し、リクエストを終了します。スコア位相がメモリまたはループの制限を超えたら、OpenSearch は警告とともに部分的な結果を返します。

BasicSimilarityScorer クラス

すべての Cava ソートスクリプトは、BasicSimilarityScorer クラスを users.scorer パッケージ内で実装しなければなりません。クラス名およびパッケージ名は固定されており、いずれかを変更するとコンパイルエラーが発生します。

package users.scorer;
import com.aliyun.opensearch.cava.framework.OpsScoreParams;
import com.aliyun.opensearch.cava.framework.OpsScorerInitParams;

class BasicSimilarityScorer {
    // ここでメンバー変数 (スコアリング特徴量、クエリパラメーターなど) を宣言します

    boolean init(OpsScorerInitParams params) {
        // この検索リクエストのメンバー変数を初期化します。
        // リクエストごとに 1 回呼び出されます。
        return true;
    }

    double score(OpsScoreParams params) {
        double score = 0;
        // ドキュメントのスコアを計算して返します。
        return score;
    }
};

メソッドリファレンス

メソッドパラメーター呼び出されるタイミング戻り値目的
initOpsScorerInitParams検索リクエストごとに 1 回boolean属性フィールドの宣言、スコアリング特徴量とクエリパラメーターの初期化
scoreOpsScoreParams候補ドキュメントごとに 1 回doubleドキュメントスコアの計算と返却

メソッドのシグネチャ (パラメーターの型と戻り値の型) は変更できません。変更するとコンパイルエラーが発生します。

各メソッドに記述する内容

  • init 内で: requireAttribute() を使用して属性フィールドを宣言し、スコアリング機能を初期化し、kvpairs パラメーターを読み取ります。すべてのリクエストレベルのセットアップはここに含まれます。

  • score では、ドキュメントフィールドを読み取り、スコアリング特徴を評価します。score でのリクエストレベルのデータの読み取りは避けてください。このメソッドはドキュメントごとに 1 回呼び出されるため、冗長な初期化はメモリと処理時間を無駄にします。

ソートスクリプトの例

以下のスクリプトは、テキスト関連性スコアと数値型ドキュメントフィールド(shop_margin)を組み合わせることで、ドキュメントを順位付けします。

package users.scorer;
import cava.lang.CString;
import com.aliyun.opensearch.cava.framework.OpsScoreParams;
import com.aliyun.opensearch.cava.framework.OpsScorerInitParams;
import com.aliyun.opensearch.cava.framework.OpsRequest;
import com.aliyun.opensearch.cava.framework.OpsKvPairs;
import com.aliyun.opensearch.cava.framework.OpsDoc;
import com.aliyun.opensearch.cava.features.similarity.TextRelevance;

class BasicSimilarityScorer {
    TextRelevance _textRelevance; // メンバー変数として宣言されたスコアリング特徴量

    boolean init(OpsScorerInitParams params) {
        if (!params.getDoc().requireAttribute("shop_margin")) { // score() で使用される属性フィールドを宣言します
            return false;
        }
        _textRelevance = TextRelevance.create(params, "default", "name"); // スコアリング特徴量を一度初期化します
        return true;
    }

    double score(OpsScoreParams params) {
        float shopMargin = params.getDoc().docFieldFloat("shop_margin"); // ドキュメントフィールドを読み取ります
        float textScore = _textRelevance.evaluate(params);               // スコアリング特徴量を評価します
        double score = textScore * 30.0 + shopMargin;
        return score;
    }
}

この例の主要なパターン:

  • _textRelevance は、init() で一度初期化されるメンバー変数であり、各 score() 呼び出しで再利用されます。これにより、冗長な初期化を回避します。

  • shop_margin は、score() で読み取りられる前に、init() 内で requireAttribute() を使用して宣言されます。

  • 最終的なスコアは、重み付けされたテキスト関連性シグナルと生のドキュメント属性を組み合わせたものです。

パフォーマンスに関する考慮事項

ソートスクリプトは、高度ソート中にドキュメントごとに実行されます。検索リクエストごとに 2 つのハードリミットが適用されます:

制限超過した場合の動作
メモリ40 MBOpenSearch はエラーを報告し、部分的な結果を返します。一部のドキュメントのみがスコアリングされ、他のドキュメントはスコアリングされない場合があります。
for ループと関数呼び出し100,000OpenSearch はエラーを報告し、早期に結果を返します。

これらの制限内に留まるには:

  • `score()` での `new` の頻繁な使用を避ける — オブジェクトの割り当ては、数千の候補に対してドキュメントごとに 1 回呼び出されるとコストが高くなります。

  • `score()` での文字列操作を最小限に抑える — 文字列は、呼び出し回数が多い場合に不釣り合いな量のメモリを消費します。

  • `rerank_size` を調整するrerank_size パラメーターを使用して、高度ソート段階に入るドキュメントの数を制御します。rerank_size を減らすと、メモリ使用量とループ回数が直接的に削減されます。

注意事項

  • 単一ファイルのアップロード、単一パッケージusers.scorer パッケージ内ですべてのクラスを定義します。アップロードできるファイルは 1 つだけであるため、すべてのクラスをそのファイル内に記述する必要があります。

  • 明示的なインポートのみ — ワイルドカード import com.aliyun.opensearch.cava.framework.* はサポートされていません。各クラスを明示的にインポートしてください。

  • 属性フィールドはアプリケーションスキーマ内に存在する必要がありますrequireAttribute() を使用して宣言し、score() で読み取るには、まずアプリケーションスキーマ内でそのフィールドを属性フィールドとして定義する必要があります。

次のステップ