Solrを使ったレシピ検索の プロトタイピング 兼山元太 2012/1/26 12年1月27日金曜日
Solrを使ったレシピ検索のプロトタイピング
兼山元太2012/1/26
12年1月27日金曜日
アジェンダ
•クックパッド?
•プロトタイピングの流れ
• Solrを使った検索のプロトタイピング
•本番での運用
12年1月27日金曜日
自己紹介
•兼山元太 @PENGUINANA_
•検索チームのエンジニア
•好き:検索と情報可視化
12年1月27日金曜日
12年1月27日金曜日
COOKPAD?•レシピ投稿サイト
•112万のユーザーのレシピ
•20~30代女性の1/2が使っている
•PC/携帯/スマートフォン
•Ruby on Rails on AWS
12年1月27日金曜日
レシピ検索•PC:•1302万UU, 1億回強/月
•モバイルの方が多い
•スーパーの店頭や家庭で
•献立決めの道具
12年1月27日金曜日
スマートフォン
12年1月27日金曜日
レシピをさがす人
•食べさせる人に喜ばれたい
•美味しいものが食べたい
•毎日同じものは作りたくない
•それでもつくる料理はすぐ決めたい
12年1月27日金曜日
レシピをさがす人
•食べさせる人に喜ばれたい
•美味しいものが食べたい
•毎日同じものは作りたくない
•それでもつくる料理はすぐ決めたい
クックパッドが解決したい問題12年1月27日金曜日
人気順検索
•人気のレシピが見つかる
•献立決めで迷わない→時間短縮→悩みを解決
毎日の料理を楽しみにすることで心からの笑顔を増やす
12年1月27日金曜日
チャーハン
12年1月27日金曜日
12年1月27日金曜日
開発サイクル•ユーザーの問題を発見する
•解決する最小のプロトタイプを作る
•本番デプロイ(一部ユーザーに公開)•インタビューやフィードバックを得て修正
12年1月27日金曜日
Chanko• github.com/cookpad/chanko
• Railsでプロトタイプを安全にデプロイする仕組み
•数十のバージョンが同時に走る
• A/Bテストにも
12年1月27日金曜日
検索画面の調整12年1月27日金曜日
検索アルゴリズムの変更12年1月27日金曜日
スマートフォンもあり12年1月27日金曜日
検索のプロトタイピング
•事前にどんなフィールドが必要かわからない
•トラフィックが多いと容易に変更できない
12年1月27日金曜日
追加した例
• メタデータの追加
• 風味、カテゴリ、副菜、材料数、肉・野菜・魚メイン、調味料 ...
• ソートの追加
• 人気度、公開日、最終編集日、スタッフ確認日 ...
12年1月27日金曜日
追加した例
• 検索フィールドの追加
• 調理器具から検索、誰がつくれぽしたか ...
• 同義語の扱いの変更
• NGRAM 分かち書き ...
12年1月27日金曜日
検索のプロトタイピング
•これらを本番に入れるのは大変だった
でも検索も本番に思いつきレベルの機能をどんどん追加したい
12年1月27日金曜日
Tritonn→ k
• Luceneを利用した検索エンジン
•非常に簡単に使える
•あまり設定しなくてもパフォーマンス出る
12年1月27日金曜日
Solrを利用している機能
•レシピ検索
•つくれぽ検索
•ユーザー検索
•無数のプロトタイプ
•社内ツール
12年1月27日金曜日
移行
•ほとんどのコードを書き直し…
•実クエリで結果を一致させた
•検索の一部をSolrに流す
• 1%->10%->50%->100%
12年1月27日金曜日
いろいろあって5:00am
それなりに大変だった…
12年1月27日金曜日
なぜ移行したのか• Tritonn•パフォーマンス悪い
•フィールド追加が辛い
•レプリがステートメントベース(本番でテーブル定義を変えにくい)
12年1月27日金曜日
•Solr•パフォーマンス悪い→良い
•フィールド追加が辛い→簡単
•レプリ→ファイルベース(本番でテーブル定義を変えやすい)
12年1月27日金曜日
•Solr•パフォーマンス悪い→良い
•フィールド追加が辛い→簡単
•レプリ→ファイルベース
!!!プロトタイピングがしやすい!!!
12年1月27日金曜日
replication
• indexとschemaをレプリケーション
•スキーマ変更も伝播する•ファイルベースなので重い変更がスレーブで走らない
master slaveindex/schema
12年1月27日金曜日
プロトタイプの流れ•まずはStagingを更新
•問題なければmaster
•例外:
•フィールド追加するだけ
•直接本番へ
12年1月27日金曜日
プロトタイプに役立つ機能
• HTTP• Dynamic Field
• Facet query• distributed search
12年1月27日金曜日
JSON via HTTP
•ブラウザで確認できて開発が楽
12年1月27日金曜日
Dynamic Field
•フィールドを事前に定義しなくていい
•新しいソートが簡単に追加できる→
•新しい検索フィールドも簡単→
12年1月27日金曜日
Dynamic Field
•フィールドを事前に定義しなくていい
•新しいソート→違う人気順アルゴリズム etc...
•新しい検索フィールド→和洋中のフラグ etc...
12年1月27日金曜日
使い方
• category_id_*• ingredient_size_i => int• popularity_f => float• verb_s => text など…
12年1月27日金曜日
facet query
• Group byと同じような機能
• facet=on&facet.field=フィールド名
•ドリルダウンUIを作るのに便利
12年1月27日金曜日
例:絞り込み検索
12年1月27日金曜日
例:絞り込み検索
12年1月27日金曜日
例:絞り込み検索
http://localhost:8983/solr/select?q=*:*&facet=on&facet.field=category_id
_i12年1月27日金曜日
「鍋」の掲載日(社内)
12年1月27日金曜日
作者さんの居住地 (社内)ソーキザンギ
12年1月27日金曜日
Distributed Search
•簡単にshardingできる
•重いクエリは4shardで投げる
•オーバーヘッドが大きいので重いクエリだけ
12年1月27日金曜日
HTTP
• HTTP経由で検索・更新できる
•並列化が簡単
• JSON via HTTP
12年1月27日金曜日
HTTPの並列化
•通常の検索画面
• 3クエリを同時に実行
•とあるプロトタイプの検索画面
• 8クエリを同時に実行
12年1月27日金曜日
例:明示的な関連性•レシピの提示順序を変える
•タイトルでマッチ
•材料のフィールドでマッチ
•その他のフィールドでマッチ
•簡単に3リクエスト並列で投げられる
12年1月27日金曜日
例:明示的な関連性•レシピの提示順序を変える
•タイトルでマッチ
•材料のフィールドでマッチ
•その他のフィールドでマッチ
•ngramでマッチ etc...簡単に3リクエスト並列で投げられる
12年1月27日金曜日
本番運用
•構成
•監視
•パフォーマンス
•テスト
12年1月27日金曜日
master
/recipes/users/shard etc...
バッチ
stagingapp
分かち書き正規化同義語展開 MySQL
index/schema slave
12年1月27日金曜日
master
/recipes/users/shard etc...
バッチ
stagingapp
分かち書き正規化同義語展開 MySQL
index/schema slave
12年1月27日金曜日
optimize()
• 可能だったらoptimize
• ~20%くらい早くなる
• master/slaveならslaveはファイルもらうだけ
master
バッチ
staging
12年1月27日金曜日
master
/recipes/users/shard etc...
バッチ
stagingapp
分かち書き正規化同義語展開 MySQL
index/schema slave
12年1月27日金曜日
stored=false
• idのみstored
•本文はMySQLから
•インデックスサイズを小さくできる
app
MySQL
slave
12年1月27日金曜日
監視(munin)
•監視項目(コア別):
•クエリ: QTime / QPS
•キャッシュ: hit/eviction
•インデックス: サイズ / docの数
•レプリ: 所要時間
12年1月27日金曜日
監視(munin)
12年1月27日金曜日
監視(munin)
12年1月27日金曜日
監視(munin)
12年1月27日金曜日
監視(munin)
12年1月27日金曜日
監視(nagios)
•監視項目(コア別):
•サーバーの基本的なヘルスチェック
•レプリ: Solr index version
•レプリ遅れてますメールが来る
12年1月27日金曜日
パフォーマンス
•レプリケーションするときやGCで瞬間的にロックすることがある
• varnishをsolrの前に置いて影響を最小化する対策を検証中
12年1月27日金曜日
おすすめ
12年1月27日金曜日
気になってる機能
• not to cache(SOLR-2429)• SurroundQuery(SOLR-2703)• BloomFilter(SOLR-1375)
12年1月27日金曜日
おすすめ
• http://blog.sematext.com
• https://issues.apache.org/jira/browse/SOLR
•@otisg
12年1月27日金曜日
今後やりたいこと•検索精度の向上
•検索セッションの分析
•クエリ分類, 検索意図
•デバイスに特化した検索
•パーソナライズ
12年1月27日金曜日
クックパッドでは
12年1月27日金曜日
エンジニアを募集しています12年1月27日金曜日
Q/A• クックパッド
• レシピ検索
• Solr
• プロトタイピング
• dynamic field
• メタデータ
• エクステンション
• A/Bテスト
• 本番での運用方法
• 監視
• テスト
• 今後
12年1月27日金曜日