Top Banner
Solrを使ったレシピ検索の プロトタイピング 兼山元太 2012/1/26 12127日金曜日
66

Solrを使ったレシピ検索のプロトタイピング

Jan 15, 2015

Download

Documents

genta kaneyama

モーショノロジー2012 #1 全文検索&検索を利用したサービスの使命、利用プロダクト、事例紹介
http://atnd.org/events/23608

発表者: クックパッド株式会社 兼山 元太
概要: Solrを使ったレシピ検索のプロトタイピング
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Solrを使ったレシピ検索のプロトタイピング

Solrを使ったレシピ検索のプロトタイピング

兼山元太2012/1/26

12年1月27日金曜日

Page 2: Solrを使ったレシピ検索のプロトタイピング

アジェンダ

•クックパッド?

•プロトタイピングの流れ

• Solrを使った検索のプロトタイピング

•本番での運用

12年1月27日金曜日

Page 3: Solrを使ったレシピ検索のプロトタイピング

自己紹介

•兼山元太 @PENGUINANA_

•検索チームのエンジニア

•好き:検索と情報可視化

12年1月27日金曜日

Page 4: Solrを使ったレシピ検索のプロトタイピング

12年1月27日金曜日

Page 5: Solrを使ったレシピ検索のプロトタイピング

COOKPAD?•レシピ投稿サイト

•112万のユーザーのレシピ

•20~30代女性の1/2が使っている

•PC/携帯/スマートフォン

•Ruby on Rails on AWS

12年1月27日金曜日

Page 6: Solrを使ったレシピ検索のプロトタイピング

レシピ検索•PC:•1302万UU, 1億回強/月

•モバイルの方が多い

•スーパーの店頭や家庭で

•献立決めの道具

12年1月27日金曜日

Page 7: Solrを使ったレシピ検索のプロトタイピング

スマートフォン

12年1月27日金曜日

Page 8: Solrを使ったレシピ検索のプロトタイピング

レシピをさがす人

•食べさせる人に喜ばれたい

•美味しいものが食べたい

•毎日同じものは作りたくない

•それでもつくる料理はすぐ決めたい

12年1月27日金曜日

Page 9: Solrを使ったレシピ検索のプロトタイピング

レシピをさがす人

•食べさせる人に喜ばれたい

•美味しいものが食べたい

•毎日同じものは作りたくない

•それでもつくる料理はすぐ決めたい

クックパッドが解決したい問題12年1月27日金曜日

Page 10: Solrを使ったレシピ検索のプロトタイピング

人気順検索

•人気のレシピが見つかる

•献立決めで迷わない→時間短縮→悩みを解決

毎日の料理を楽しみにすることで心からの笑顔を増やす

12年1月27日金曜日

Page 11: Solrを使ったレシピ検索のプロトタイピング

チャーハン

12年1月27日金曜日

Page 12: Solrを使ったレシピ検索のプロトタイピング

12年1月27日金曜日

Page 13: Solrを使ったレシピ検索のプロトタイピング

開発サイクル•ユーザーの問題を発見する

•解決する最小のプロトタイプを作る

•本番デプロイ(一部ユーザーに公開)•インタビューやフィードバックを得て修正

12年1月27日金曜日

Page 14: Solrを使ったレシピ検索のプロトタイピング

Chanko• github.com/cookpad/chanko

• Railsでプロトタイプを安全にデプロイする仕組み

•数十のバージョンが同時に走る

• A/Bテストにも

12年1月27日金曜日

Page 15: Solrを使ったレシピ検索のプロトタイピング

検索画面の調整12年1月27日金曜日

Page 16: Solrを使ったレシピ検索のプロトタイピング

検索アルゴリズムの変更12年1月27日金曜日

Page 17: Solrを使ったレシピ検索のプロトタイピング

スマートフォンもあり12年1月27日金曜日

Page 18: Solrを使ったレシピ検索のプロトタイピング

検索のプロトタイピング

•事前にどんなフィールドが必要かわからない

•トラフィックが多いと容易に変更できない

12年1月27日金曜日

Page 19: Solrを使ったレシピ検索のプロトタイピング

追加した例

• メタデータの追加

• 風味、カテゴリ、副菜、材料数、肉・野菜・魚メイン、調味料 ...

• ソートの追加

• 人気度、公開日、最終編集日、スタッフ確認日 ...

12年1月27日金曜日

Page 20: Solrを使ったレシピ検索のプロトタイピング

追加した例

• 検索フィールドの追加

• 調理器具から検索、誰がつくれぽしたか ...

• 同義語の扱いの変更

• NGRAM 分かち書き ...

12年1月27日金曜日

Page 21: Solrを使ったレシピ検索のプロトタイピング

検索のプロトタイピング

•これらを本番に入れるのは大変だった

でも検索も本番に思いつきレベルの機能をどんどん追加したい

12年1月27日金曜日

Page 22: Solrを使ったレシピ検索のプロトタイピング

Tritonn→  k

• Luceneを利用した検索エンジン

•非常に簡単に使える

•あまり設定しなくてもパフォーマンス出る

12年1月27日金曜日

Page 23: Solrを使ったレシピ検索のプロトタイピング

Solrを利用している機能

•レシピ検索

•つくれぽ検索

•ユーザー検索

•無数のプロトタイプ

•社内ツール

12年1月27日金曜日

Page 24: Solrを使ったレシピ検索のプロトタイピング

移行

•ほとんどのコードを書き直し…

•実クエリで結果を一致させた

•検索の一部をSolrに流す

• 1%->10%->50%->100%

12年1月27日金曜日

Page 25: Solrを使ったレシピ検索のプロトタイピング

いろいろあって5:00am

それなりに大変だった…

12年1月27日金曜日

Page 26: Solrを使ったレシピ検索のプロトタイピング

なぜ移行したのか• Tritonn•パフォーマンス悪い

•フィールド追加が辛い

•レプリがステートメントベース(本番でテーブル定義を変えにくい)

12年1月27日金曜日

Page 27: Solrを使ったレシピ検索のプロトタイピング

•Solr•パフォーマンス悪い→良い

•フィールド追加が辛い→簡単

•レプリ→ファイルベース(本番でテーブル定義を変えやすい)

12年1月27日金曜日

Page 28: Solrを使ったレシピ検索のプロトタイピング

•Solr•パフォーマンス悪い→良い

•フィールド追加が辛い→簡単

•レプリ→ファイルベース

!!!プロトタイピングがしやすい!!!

12年1月27日金曜日

Page 29: Solrを使ったレシピ検索のプロトタイピング

replication

• indexとschemaをレプリケーション

•スキーマ変更も伝播する•ファイルベースなので重い変更がスレーブで走らない

master slaveindex/schema

12年1月27日金曜日

Page 30: Solrを使ったレシピ検索のプロトタイピング

プロトタイプの流れ•まずはStagingを更新

•問題なければmaster

•例外:

•フィールド追加するだけ

•直接本番へ

12年1月27日金曜日

Page 31: Solrを使ったレシピ検索のプロトタイピング

プロトタイプに役立つ機能

• HTTP• Dynamic Field

• Facet query• distributed search

12年1月27日金曜日

Page 32: Solrを使ったレシピ検索のプロトタイピング

JSON via HTTP

•ブラウザで確認できて開発が楽

12年1月27日金曜日

Page 33: Solrを使ったレシピ検索のプロトタイピング

Dynamic Field

•フィールドを事前に定義しなくていい

•新しいソートが簡単に追加できる→

•新しい検索フィールドも簡単→

12年1月27日金曜日

Page 34: Solrを使ったレシピ検索のプロトタイピング

Dynamic Field

•フィールドを事前に定義しなくていい

•新しいソート→違う人気順アルゴリズム etc...

•新しい検索フィールド→和洋中のフラグ etc...

12年1月27日金曜日

Page 35: Solrを使ったレシピ検索のプロトタイピング

使い方

• category_id_*• ingredient_size_i => int• popularity_f => float• verb_s => text など…

12年1月27日金曜日

Page 36: Solrを使ったレシピ検索のプロトタイピング

facet query

• Group byと同じような機能

• facet=on&facet.field=フィールド名

•ドリルダウンUIを作るのに便利

12年1月27日金曜日

Page 37: Solrを使ったレシピ検索のプロトタイピング

例:絞り込み検索

12年1月27日金曜日

Page 38: Solrを使ったレシピ検索のプロトタイピング

例:絞り込み検索

12年1月27日金曜日

Page 39: Solrを使ったレシピ検索のプロトタイピング

例:絞り込み検索

http://localhost:8983/solr/select?q=*:*&facet=on&facet.field=category_id

_i12年1月27日金曜日

Page 40: Solrを使ったレシピ検索のプロトタイピング

「鍋」の掲載日(社内)

12年1月27日金曜日

Page 41: Solrを使ったレシピ検索のプロトタイピング

作者さんの居住地 (社内)ソーキザンギ

12年1月27日金曜日

Page 42: Solrを使ったレシピ検索のプロトタイピング

Distributed Search

•簡単にshardingできる

•重いクエリは4shardで投げる

•オーバーヘッドが大きいので重いクエリだけ

12年1月27日金曜日

Page 43: Solrを使ったレシピ検索のプロトタイピング

HTTP

• HTTP経由で検索・更新できる

•並列化が簡単

• JSON via HTTP

12年1月27日金曜日

Page 44: Solrを使ったレシピ検索のプロトタイピング

HTTPの並列化

•通常の検索画面

• 3クエリを同時に実行

•とあるプロトタイプの検索画面

• 8クエリを同時に実行

12年1月27日金曜日

Page 45: Solrを使ったレシピ検索のプロトタイピング

例:明示的な関連性•レシピの提示順序を変える

•タイトルでマッチ

•材料のフィールドでマッチ

•その他のフィールドでマッチ

•簡単に3リクエスト並列で投げられる

12年1月27日金曜日

Page 46: Solrを使ったレシピ検索のプロトタイピング

例:明示的な関連性•レシピの提示順序を変える

•タイトルでマッチ

•材料のフィールドでマッチ

•その他のフィールドでマッチ

•ngramでマッチ etc...簡単に3リクエスト並列で投げられる

12年1月27日金曜日

Page 47: Solrを使ったレシピ検索のプロトタイピング

本番運用

•構成

•監視

•パフォーマンス

•テスト

12年1月27日金曜日

Page 48: Solrを使ったレシピ検索のプロトタイピング

master

/recipes/users/shard etc...

バッチ

stagingapp

分かち書き正規化同義語展開 MySQL

index/schema slave

12年1月27日金曜日

Page 49: Solrを使ったレシピ検索のプロトタイピング

master

/recipes/users/shard etc...

バッチ

stagingapp

分かち書き正規化同義語展開 MySQL

index/schema slave

12年1月27日金曜日

Page 50: Solrを使ったレシピ検索のプロトタイピング

optimize()

• 可能だったらoptimize

• ~20%くらい早くなる

• master/slaveならslaveはファイルもらうだけ

master

バッチ

staging

12年1月27日金曜日

Page 51: Solrを使ったレシピ検索のプロトタイピング

master

/recipes/users/shard etc...

バッチ

stagingapp

分かち書き正規化同義語展開 MySQL

index/schema slave

12年1月27日金曜日

Page 52: Solrを使ったレシピ検索のプロトタイピング

stored=false

• idのみstored

•本文はMySQLから

•インデックスサイズを小さくできる

app

MySQL

slave

12年1月27日金曜日

Page 53: Solrを使ったレシピ検索のプロトタイピング

監視(munin)

•監視項目(コア別):

•クエリ: QTime / QPS

•キャッシュ: hit/eviction

•インデックス: サイズ / docの数

•レプリ: 所要時間

12年1月27日金曜日

Page 54: Solrを使ったレシピ検索のプロトタイピング

監視(munin)

12年1月27日金曜日

Page 55: Solrを使ったレシピ検索のプロトタイピング

監視(munin)

12年1月27日金曜日

Page 56: Solrを使ったレシピ検索のプロトタイピング

監視(munin)

12年1月27日金曜日

Page 57: Solrを使ったレシピ検索のプロトタイピング

監視(munin)

12年1月27日金曜日

Page 58: Solrを使ったレシピ検索のプロトタイピング

監視(nagios)

•監視項目(コア別):

•サーバーの基本的なヘルスチェック

•レプリ: Solr index version

•レプリ遅れてますメールが来る

12年1月27日金曜日

Page 59: Solrを使ったレシピ検索のプロトタイピング

パフォーマンス

•レプリケーションするときやGCで瞬間的にロックすることがある

• varnishをsolrの前に置いて影響を最小化する対策を検証中

12年1月27日金曜日

Page 60: Solrを使ったレシピ検索のプロトタイピング

おすすめ

12年1月27日金曜日

Page 61: Solrを使ったレシピ検索のプロトタイピング

気になってる機能

• not to cache(SOLR-2429)• SurroundQuery(SOLR-2703)• BloomFilter(SOLR-1375)

12年1月27日金曜日

Page 63: Solrを使ったレシピ検索のプロトタイピング

今後やりたいこと•検索精度の向上

•検索セッションの分析

•クエリ分類, 検索意図

•デバイスに特化した検索

•パーソナライズ

12年1月27日金曜日

Page 64: Solrを使ったレシピ検索のプロトタイピング

クックパッドでは

12年1月27日金曜日

Page 65: Solrを使ったレシピ検索のプロトタイピング

エンジニアを募集しています12年1月27日金曜日

Page 66: Solrを使ったレシピ検索のプロトタイピング

Q/A• クックパッド

• レシピ検索

• Solr

• プロトタイピング

• dynamic field

• メタデータ

• エクステンション

• A/Bテスト

• 本番での運用方法

• 監視

• テスト

• 今後

12年1月27日金曜日