Upgrade to Pro — share decks privately, control downloads, hide ads and more …

VespaのParent Childを用いたフィードパフォーマンスの改善

VespaのParent Childを用いたフィードパフォーマンスの改善

Vespa の Parent-Child を使って、検索連動型広告における「親ドキュメント更新により子ドキュメントを大量更新してしまう問題」をどう改善したかを紹介したスライド資料です。スタンバイの求人検索エンジンを題材に、非正規化の限界、Parent-Child の仕組み、導入効果、設計上のトレードオフをまとめています。

Avatar for 小野崇之

小野崇之

April 28, 2026

Other Decks in Technology

Transcript

  1. © Stanby, Inc. About Me 株式会社スタンバイ プロダクト部 SearchGroup ソフトウェアエンジニア 小野

    崇之 @takono ## Update WorkStyles 求人検索エンジンにおける広告配信機能の開発、 検索品質の改善、システムの安定稼働に従事。 2
  2. © Stanby, Inc. スタンバイの検索連動型広告 5 1. 求人票入稿 2. キャンペーン設定 4.

    広告配信 3. インデックス 3. インデックス クエリ と 求人票で マッチング 求人票とキャンペーン の紐づけ 広告主が配信条件や入 札金額を設定 キャンペーン配信制御 広告主が 自社の求人票を入稿 関連度 +入札金額 で ランキング
  3. © Stanby, Inc. データの特徴:求人票とキャンペーンの比較 6 求人票 • マッチング対象となる子ドキュメント • タイトル、勤務地、応募条件等の基本情報

    • 検索クエリとの関連度スコアを算出 • 大量に存在し、頻繁に更新される キャンペーン • 複数の求人票を束ねる親ドキュメント • 予算、入札金額、掲載期間等の配信条件 • ランキング時にCPCなどが考慮される • 高頻度更新かつリアルタイム性が必要 ・配信実績に応じた入札金額の調節 ・予算達成時の配信停止 ・求人内容の更新 ・募集の停止
  4. © Stanby, Inc. ドキュメントフィードの流れ 7 求人票更新 キャンペーン更新 求人票に キャンペーンを 埋め込み

    検索エンジンへのインデックス 求人票A キャンペーンX 非正規化してフィード 求人票B キャンペーンX 求人票C キャンペーンX キャンペーン更新時には 全求人票の更新が必要
  5. © Stanby, Inc. 検索エンジンにおける 正規化 vs 非正規化 8 比較項目 正規化

    非正規化 クエリパフォーマンス 低下しやすい (Join処理の負荷) 非常に高い (高速な単一取得) フィード時に非正規化 親データの更新コスト 高い (親のみ更新で完結) RDBのような整合性維持が容易 低い (紐づく子すべてを更新) 更新頻度が高いと高負荷
  6. © Stanby, Inc. 検索連動型広告における非正規化の課題 9 前提条件 • キャンペーンと求人票は 1対N で紐づく

    (多い1万件以上) • 求人票のリランキング時にキャンペーンの情報を参照する ・キャンペーン更新時に紐づく全求人を更新する必要がある ・求人票とキャンペーンの同時更新を行った際に、ロックが発生する 【最大のリスク】 キャンペーンの更新遅延による機会損失
  7. Vespa Parent-Child の機能 © Stanby, Inc. 9 親ドキュメントの項目を子ドキュメントから参照できる機能 主なメリット •

    子ドキュメントから親ドキュメントの項目を参照可能 • 親の更新が子に即座に反映 • 親を全コンテンツノードに複製し、ローカル参照で検索性能を維持 • スケーリング時も親データは自動で複製される
  8. © Stanby, Inc. Vespa Parent-Child の制約 11 • 参照整合性は保証されない 存在しない親を参照できるため、整合性の監視が必要です

    • 間接参照による検索パフォーマンスの悪化 直接的な非正規化と比較して、属性参照のオーバーヘッドが発生します • 一方向の参照 子から親への参照のみ可能で、親から子への参照や循環参照はできません
  9. © Stanby, Inc. Vespa Parent-Child の設定方法 12 1. スキーマ定義 (.sd)

    // job.sd import field campaign_ref.cpc as cpc {} field campaign_ref type reference<campaign> { indexing: attribute } // campaign.sd field cpc type double { indexing: attribute } 2. クエリ実行 (YQL) select * from job where cpc > 1000 解説 ・子は reference<campaign> で親を参照 ・import field で親属性を子から利用 ・親属性はフィルタやランキングに透過的に使える
  10. ドキュメントフィードの流れ ‐ Parent-Child版 © Stanby, Inc. キャンペーン更新 求人票更新 IDで紐づけ 検索エンジンへのインデックス

    求人票A 求人票B 求人票C キャンペーンX 1件だけフィード 更新処理の分離 キャンペーンの更新は 即時求人票側に反映される
  11. © Stanby, Inc. Vespa Parent-Child の導入効果 14 • キャンペーン更新の圧倒的な効率化 ・求人ドキュメントの更新が不要になった

    ・キャンペーンと求人票の同時更新が可能になった ・データの不整合のリスクを低減 ・キャンペーンのフィードは即時に可能 • 検索パフォーマンスへの影響は許容範囲内 直接的な非正規化と比較して、属性参照のオーバーヘッドが発生しますが、運用的には問題ありません ★1万件以上紐づくキャンペーンを100ms未満で更新 ★更新処理が重なった場合も、キャンペーンが別処理に なったため、遅延がない
  12. © Stanby, Inc. まとめ 15 スタンバイの検索連動型広告の課題 検索エンジン上に求人とキャンペーンの特性が異なる2種類のドキュメントが存在します。 親子ドキュメントの非正規化により、キャンペーンの更新が遅延するリスクがありました。 Vespa Parent-Child

    の機能紹介 親ドキュメントのグローバルドキュメント化による参照のボトルネックの削減。 制約がありながらも、親ドキュメントのフィード効率を改善できる機能です。 キャンペーン更新への活用成果 Parent-Child により検索パフォーマンスの低減を最低限に抑えつつ、キャンペーン更新の効率化を実現でき ました。