opensearch-function-scoring-algorithms について
OpenSearch または Elasticsearch でマーケットプレイス検索を構築するエンジニア向けのランキング手法集です。研究に基づく56のルールを9段階に整理し、コード例と出典を示します。
主な機能
- 019カテゴリにわたる56のルール
- 02OpenSearchとElasticsearchのクエリ例
- 03検索候補、スコアリング、パーソナライズの手法
- 04バイアス補正とマーケットプレイスの公平性
- 05オフライン評価とA/Bテストの指針
- 06研究論文と公式ドキュメントの引用
活用シーン
- 01マーケットプレイス検索ランキングの新規設計
- 02ハイブリッド検索やスコアリングクエリの調整
- 03LTR学習前のクリックログのバイアス補正
- 04オフライン指標とA/Bテストによる順位変更の評価
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ pproenca/ dot-skills --skill opensearch-function-scoring-algorithmsインストール後、Claude Code で/opensearch-function-scoring-algorithmsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
AGENTS.mdmetadata.jsonassets/templates/_template.mdreferences/_sections.mdbias-click-models.mdbias-counterfactual-eval.mdbias-interleaved-evaluation.mdbias-popularity-debiasing.mdbias-position-ips.mdbias-thompson-sampling.mddecay-exp-freshness.mddecay-gauss-geo.mddecay-multi-field-composition.mddecay-offset-noise.mddecay-scale-calibration.mddiv-category-diversity.mddiv-dpp-quality-diversity.mddiv-max-per-host.mddiv-mmr-rerank.mddiv-window-penalty.mdeval-ab-sample-size-mde.mdeval-ablation-attribution.mdeval-cuped-variance-reduction.mdeval-graded-judgment-set.mdeval-ndcg-primary-metric.mdeval-online-offline-correlation.mdeval-regression-query-suite.mdmarket-cold-start-exploration.mdmarket-conversion-weighted-ranking.mdmarket-host-quality-signals.md詳細
マーケットプレイスの調査:OpenSearch の関数スコアリングに関するベストプラクティス
OpenSearch または Elasticsearch 上に実装された、両面マーケットプレイス(Airbnb、Uber Eats、DoorDash、Etsy、eBay、Booking.com)のランキングに関する、調査に基づくアルゴリズムの要点をまとめた資料です。検索ランキングパイプラインでのカスケード効果に基づいて優先順位付けされた9 カテゴリ、全 56 件のルールを収録しています。各ルールでは、修正対象となる理由(カスケードまたはバイアス)を説明し、誤ったコードと正しいコードを比較して示します(OpenSearch の JSON クエリ、Painless スクリプト、Python による前処理、評価手法)。また、このパターンを大規模に実証したマーケットプレイスの技術ブログ、KDD/SIGIR/WSDM の論文、OpenSearch のドキュメントなど、信頼できる情報源へのリンクも掲載しています。
適用する場面
次のような場合に、このスキルを活用してください。
- OpenSearch または Elasticsearch で、新しいマーケットプレイス検索システムを一から設計する
- 効果が見られない
function_score/rank_feature/script_scoreクエリを調整する - Reciprocal Rank Fusion を使用したハイブリッド検索(BM25 + 密ベクトル)を設定する
- 数十億規模の ANN インデックスで HNSW と IVF のどちらを選ぶか検討する
- リスティング/ユーザーの埋め込みやツータワーアーキテクチャを使ってパーソナライズを追加する
- LTR モデルを再トレーニングする前に、クリックログの掲載順位バイアスを補正する
- 表示機会の公平性や、新しいリスティングに対するコールドスタート時の表示機会配分を設計する
- 地理情報 + 日付 + 新しさに対する減衰関数(gauss/exp/linear)を組み合わせる
- MMR、DPP、またはホストごとの上限を使って、上位表示枠の多様性を高める
- 「上位 10 件に同じホストのリスティングが 8 件表示されるのはなぜか?」や「ランキングが既存の人気リスティングを優遇するのはなぜか?」といった問題をデバッグする
- オフライン評価基盤を構築する — 段階評価付きの判定セット、NDCG@k パイプライン、アブレーションスタディ、回帰テスト用クエリスイート
- ランキング変更の A/B テストを設計する — MDE/検出力/必要サンプルサイズの事前計算、CUPED による分散低減、オンラインとオフラインの相関関係の調整
- 特定のスコアリング要素による改善効果を特定する — 「改善したのは新しいバイアス補正か、それとも埋め込みか、あるいは両方か?」
このルールは、宿泊施設、フードデリバリー、レストラン、サービス、求人、中古品、不動産など、分野を問わず、OpenSearch/Elasticsearch を基盤とするあらゆるマーケットプレイス検索に適用できます。該当するキーワードには、「マーケットプレイスのランキング」「検索関連性」「function_score」「rank_feature」「script_score」「kNN」「ハイブリッド検索」「RRF」「Learning to Rank」「埋め込みベースの検索」「ツータワー」「掲載順位バイアス」「MMR」「供給側の公平性」「パレート多目的最適化」「NDCG」「判定セット」「アブレーションスタディ」「CUPED」「A/B テストのサンプルサイズ」「ランキング評価」「検索結果が悪い理由」などがあります。
検索ランキングのライフサイクル
カテゴリは、マーケットプレイスの検索ランキングパイプラインに基づいています。前段階の不備は後続の段階にも影響します。つまり、再現率(ステージ 1)での漏れは、後続のブーストでは補えず、ベースの関連性が誤っていると、あらゆる関数スコアにその影響が乗じられます。
Query → [1] Recall → [2] Base Relevance → [3] Quality Signals → [4] Personalization
→ [5] Geo/Time Decay → [6] Marketplace Balance → [7] Diversity Re-rank → Results
↑
[8] Bias Correction (applied across all stages
and into training)
↑
[9] Evaluation & Measurement (the meta-layer:
judgment sets, NDCG, ablation, A/B
sizing, CUPED — without these you
can't tell if any rule helped)
優先度別のルールカテゴリ
| 優先度 | カテゴリ | 影響度 | プレフィックス | ルール数 |
|---|---|---|---|---|
| 1 | 候補の取得と再現率 | 重大 | recall- | 6 |
| 2 | ベースの関連性とフィールドスコアリング | 重大 | rel- | 7 |
| 3 | 品質シグナルと信頼区間 | 高 | qual- | 6 |
| 4 | パーソナライズと埋め込み | 高 | pers- | 7 |
| 5 | 空間的・時間的減衰 | 高 | decay- | 5 |
| 6 | 両面マーケットプレイスのバランス | 高 | market- | 7 |
| 7 | バイアス補正とオンライン学習 | 高 | bias- | 6 |
| 8 | 評価と測定 | 高 | eval- | 7 |
| 9 | 多様性と再ランキング | 中〜高 | div- | 5 |
クイックリファレンス
1. 候補の取得と再現率(重大)
recall-hybrid-rrf— BM25 と kNN を Reciprocal Rank Fusion で組み合わせますrecall-two-tower-ebr— Two-Tower アーキテクチャを使った埋め込みベースの検索を行いますrecall-prefilter-knn— 厳格な制約条件を設けて kNN に事前フィルターを適用しますrecall-hnsw-vs-ivf— レイテンシを重視する場合は HNSW、大規模環境でメモリを重視する場合は IVF を選択しますrecall-multi-stage— 検索を、低コストの候補取得と高コストの再ランク付けに分けますrecall-query-expansion— 再現率を高めるにはインデックス作成時に、適合率を高めるにはクエリ時に同義語を展開します
2. 基本的な適合度とフィールドスコアリング(重大)
rel-bm25f-field-weights— k1/b を調整する前に BM25F のフィールドの重みを調整しますrel-multi-match-strategy— デフォルトで選ぶのではなく、クエリの形状に応じて multi_match のタイプを選択しますrel-bm25-k1-b-tuning— 短いマーケットプレイス文書向けに、フィールドごとに BM25 の k1 と b を調整しますrel-listwise-loss— LTR の損失関数には、ペアワイズ(RankNet)よりリストワイズ(LambdaMART)を優先しますrel-script-score-over-function-score— スコアを合成するには function_score ではなく script_score クエリを使いますrel-rescore-over-bool-should— 検索時に bool/should を使うのではなく、重いスコアリングには rescore フェーズを使いますrel-avoid-boost-inflation— フィールドのブーストが約10倍を超えて膨らまないようにします
3. 品質シグナルと信頼区間(高)
qual-wilson-lower-bound— 平均評価ではなく Wilson の下限でソートしますqual-bayesian-average— サンプル数が少ない星評価にはベイズ平均を使いますqual-rank-feature-saturation— rank_feature.saturation で人気度カウントを飽和させますqual-rank-feature-sigmoid— 値の範囲が限定された比率シグナルにはシグモイド修飾子を適用しますqual-log1p-vs-saturation— ロングテールのシグナルを保持するには、飽和処理より log1p を選択しますqual-completeness-score— リスティングの完全性を品質シグナルとしてスコアリングします
4. パーソナライズと埋め込み(高)
pers-listing-embeddings— 予約セッションの共起からリスティングの埋め込みを学習しますpers-type-embeddings-cold-start— コールドスタートのユーザーとリスティングにはタイプ埋め込みを使いますpers-real-time-session-vector— クリックイベントからセッションベクトルをリアルタイムに更新しますpers-multi-modal-embeddings— 候補取得にマルチモーダル埋め込み(テキスト+画像)を使いますpers-cross-encoder-rerank— パーソナライズのため、上位50件にクロスエンコーダーによる再ランク付けを適用しますpers-tower-split-offline-online— アイテムタワーをオフラインに、クエリタワーをオンラインに分けますpers-contextual-features— コンテキスト特徴量を script_score に注入します
5. 空間・時間減衰(高)
decay-gauss-geo— 地理的距離には線形減衰ではなくガウス減衰を使用するdecay-exp-freshness— 時間的な鮮度には指数減衰、日付の近さにはガウス減衰を使用するdecay-scale-calibration— スコアが0.5になる距離を目標に減衰スケールを調整するdecay-offset-noise— ノイズの多い疎なフィールドでは、減衰関数にオフセットを追加するdecay-multi-field-composition— 明示的な重みを使って複数フィールドの減衰を合成する
6. 双方向マーケットプレイスのバランス(高)
market-conversion-weighted-ranking— クリック率ではなくコンバージョン率に基づいてランキングに重みを付けるmarket-cold-start-exploration— 上限を設けた露出配分により、コールドスタートのリスティングを優遇するmarket-supply-fairness-lorenz— ローレンツ/ジニ指標で供給側の公平性を監視するmarket-host-quality-signals— ホスト品質とリスティング品質のシグナルを分けるmarket-inventory-health— 在庫健全性の低いリスティングにペナルティを与えるmarket-pareto-multi-objective— パレートを考慮した重みで多目的ランキングを最適化するmarket-price-relevance— 厳格なフィルターではなく、緩やかな範囲で価格の関連性をスコアリングする
7. バイアス補正とオンライン学習(高)
bias-position-ips— 逆傾向スコアリングで位置バイアスを補正するbias-click-models— PBM、カスケードモデル、DBNでクリック傾向を推定するbias-thompson-sampling— トンプソンサンプリングでランキングの代替案を探索するbias-counterfactual-eval— 反実仮想評価でランキングの変更を検証するbias-interleaved-evaluation— トラフィックが少ないランキング比較にはインターリーブ評価を使用するbias-popularity-debiasing— 埋め込み学習のネガティブ例では、人気アイテムをサブサンプリングする
8. 評価と測定(高)
eval-graded-judgment-set— オフライン評価用の段階評価付き判定セットを構築するeval-ndcg-primary-metric— NDCG@kをオフラインランキングの主要指標として使用するeval-online-offline-correlation— オフラインスコアを信頼する前に、オンラインとオフラインの指標の相関を検証するeval-ablation-attribution— アブレーションスタディを実施し、改善分を特定のコンポーネントに帰属させるeval-ab-sample-size-mde— 実施前にMDEからA/Bテストのサンプルサイズを計算するeval-cuped-variance-reduction— 実験前の共変量を用いてCUPEDを適用し、A/Bテストのサンプルサイズを半減するeval-regression-query-suite— 気付かれにくい品質低下を検出するため、回帰クエリスイートを維持する
9. 多様性と再ランキング(中〜高)
div-mmr-rerank— MMR 再ランキングを適用して、上位ウィンドウの多様性を確保するdiv-max-per-host— グループごとの最大件数制約で、ホストあたりのインプレッション数を制限するdiv-category-diversity— 上位ウィンドウでカテゴリを階層的に多様化するdiv-dpp-quality-diversity— 行列式点過程を使用して、品質と多様性を同時に実現するdiv-window-penalty— 再スコアリングでウィンドウベースの多様性ペナルティを適用する
使用方法
「地理的距離にはどの減衰関数を使うべきか」といった具体的な質問には、該当するルール(decay-gauss-geo)を直接参照してください。各ルールには、理由、OpenSearch クエリ/Painless コード、標準的な出典がすべて含まれています。
ランキングシステム全体をレビューする場合は、カテゴリを上から順に確認してください。このカスケードの順序には意味があります。まずリコールを正しく処理します(ブーストでは、候補から漏れたものを取り戻せません)。次に基本関連度を調整します(これはすべての機能スコアに掛け合わされる値です)。その後、品質、パーソナライゼーション、減衰、マーケットプレイスのバランス、バイアス補正の順に進めます。多様性は、適切に順序付けられた上位ウィンドウに対する最後の再ランキングステップです。
再トレーニングの前にバイアスを補正する場合は、bias-position-ips と bias-click-models から始めてください。位置による交絡があるクリックデータに IPS を適用することは、ログに記録されたクリックで LTR モデルを再トレーニングするマーケットプレイスにとって、最も効果の大きい変更です。
複数のアルゴリズムを組み合わせてテストし、実証的に検証する場合は、eval-graded-judgment-set(基盤を構築)、eval-ndcg-primary-metric(指標を選択)、eval-ablation-attribution(特定のコンポーネントによる改善を特定)の順に始めてください。オフライン指標がオンラインの動作を予測できるかを検証するには eval-online-offline-correlation を併用し、規律ある A/B テストには eval-ab-sample-size-mde と eval-cuped-variance-reduction を、名前付きクエリで気付かれにくい品質低下を検出するには eval-regression-query-suite を併用してください。
設計上の決定について研究論文などを引用する場合は、各ルールの末尾に標準的な参考文献があります。KDD/SIGIR/WSDM の論文、関連するエンジニアリングブログ(Airbnb、Pinterest、DoorDash、Etsy、Just Eat Takeaway、Thumbtack)、または OpenSearch のドキュメントページが掲載されています。
カテゴリの順序を決めたカスケードへの影響に関する根拠については、セクションの定義を参照してください。新しいルールを追加する場合は、ルールのテンプレートを参照してください。
参考ファイル
| ファイル | 説明 |
|---|---|
| references/_sections.md | カテゴリの定義と、カスケードへの影響に基づく順序 |
| AGENTS.md | コンパクトな目次ナビゲーション(自動生成。手動で編集しないでください) |
| assets/templates/_template.md | 新しいルールを作成するためのテンプレート |
| metadata.json | バージョンと権威ある参考 URL |