新「つくれぽ」検索の開発について/Cookpad Tech Kitchen#24
by
Yusuke Naito
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
事業開発部 内藤雄介 2020/08/21 Cookpad Tech Kitchen #24 新「つくれぽ」検索の 開発について
Slide 2
Slide 2 text
● 内藤 雄介 @9toon ● 14年新卒→(子会社化/転籍)→19年再入社 ● 事業開発部サーチエンジニアリングG長 ● バックエンドエンジニア ● 大阪からフルリモート 自己紹介
Slide 3
Slide 3 text
● 新「つくれぽ」とは? ● 新「つくれぽ」の検索機能の開発について ○ 全文検索システムの選定 ○ 検索精度向上の工夫 ■ フィルタリング ■ ランキング 今日お話すること
Slide 4
Slide 4 text
新「つくれぽ」とは?
Slide 5
Slide 5 text
● 2006年に誕生 ● レシピ作者に「ありがとう」 を伝える手段 これまでの「つくれぽ」とは?
Slide 6
Slide 6 text
「感謝」から「みんなへのおすすめ」へ ref: 『13年続いた「つくれぽ」をリニューアルした話』
Slide 7
Slide 7 text
新「つくれぽ」とは? ● 「みんなへのおすすめ」の手段 ● 他人が見ても楽しめるように リッチなフォーマットに進化 ○ 3枚までの写真/動画 ○ ハッシュタグ
Slide 8
Slide 8 text
新「つくれぽ」の検索機能の開発
Slide 9
Slide 9 text
● 世界最大級のRailsモノリス ● 「理由はよくわからないがとにかくこれをさわるだけ で開発期間が3倍になる」 cookpad_all という魔境
Slide 10
Slide 10 text
「ふつう」のRails開発をするために ref: クックパッド開発者ブログ『モダンBFFを活用した既存APIサーバーの再構築』 ● Microservices化 ○ Rails 6.0.x ○ Ruby 2.6 ○ Aurora MySQL... ● Orcha(BFF)を通して 新旧APIを統合
Slide 11
Slide 11 text
検索システムも「身軽」にしたい ● レシピ検索にはSolrを長年利用している ● 既存検索システムの課題 ○ 「人気順」等の大事な機能を支えるバッチ類やビジ ネスロジックが入り乱れていて触りづらい... ○ Solr4.9を使っていてかなり古かった(※当時) ● →別システムに切り出して開発したい ref: クックパッド開発者ブログ『レシピ検索を支えるレガシーでクリティカルな 大規模バッチを刷新した話』
Slide 12
Slide 12 text
「いい検索システム」とは ● 「フィルタリング」✕「ランキング」 ● フィルタリング: ○ 文書群の中から目的の文書をどう絞り込むか? ○ 全文検索では文章をどう単語に分割するかが重要 ● ランキング: ○ 絞り込んだ文書をどう順序に並べるか?
Slide 13
Slide 13 text
検索エンジンをどう選定するか? ● Amazon Elasticsearch Service(AES)を採用した ○ いち早く検証に入りたい(構築コスト) ○ 開発に集中したい(運用コスト) ● 制約: ○ ユーザ辞書が使えない(※当時) ○ Close Index APIが使えない
Slide 14
Slide 14 text
● 「鶏もも肉のトマト煮」 ○ 辞書なし(素の kuromoji) ■ 鶏もも_肉_の_トマト_煮 ○ 辞書あり ■ 鶏もも肉_の_トマト煮 ○ ↑料理ドメインでは頻出の「鶏もも肉」でも適切に 分かち書きできない! ユーザー辞書の有無での形態素解析の差分
Slide 15
Slide 15 text
Analyzerの働き 1. Char filter(文字列のまま処理) ○ 例. HTML文字列の除去 etc. 2. Tokenizer(文字列をトークン(単語)に分割) ○ 例. ngram, kuromoji, whitespace 3. Token filter(トークンに対する処理) ○ 例. synonym(同義語の展開)
Slide 16
Slide 16 text
● レシピ検索で培った言語資源が gem 化されている ○ text_processor(MeCab+カスタム辞書のwrapper) ○ word_essence(後述) ● 「分かち書き」をアプリケーション側で行う ○ text_processor で分割して空白区切りに直す ○ Elasticsearchでは同義語の展開のみ行う ■ whitespace tokenizer + synonym token filter 今回採用した方法
Slide 17
Slide 17 text
1. Elasticsearchを自前でHostする a. EC2上に構築する b. ECS上に構築する(cookpad mart はこれ) 2. Elastic Cloudを利用する 3. etc? 他にどんな選択肢があった? ● カスタムプラグインを使う? ● NEologd や UniDic のような別の辞書を使う? ref: クックパッド開発者ブログ『サービス特性にあった検索システムの設計戦略』
Slide 18
Slide 18 text
フィルタリングの工夫 - クエリ理解 ● word_essence という社内 gem ○ ある単語がどういう属性なのかを判定できる ○ 例. メニュー名、原材料名、調味料 etc. ● 「トマト パスタ」は「原材料+メニュー名」と分かる ○ フレーズ検索に切り替える ■ ✕パスタ用トマト ■ ○トマト風味の地中海風パスタ
Slide 19
Slide 19 text
● 「つくれぽ」は人気の「レシピ」に集まりやすい ○ 単純に並べると、特定の「レシピ」への「つくれ ぽ」に検索結果が偏ってしまう ○ →「レシピを探す体験」が損なわれる ● ebay さんの技術記事を参考に、ページ内の「多様性」 を制御するリランクの仕組みを導入 ランキングの工夫 - Diversify ref: https://tech.ebayinc.com/engineering/diversity-in-search/
Slide 20
Slide 20 text
リランク後の 検索結果 ランキングの工夫 - Diversify ref: https://tech.ebayinc.com/engineering/diversity-in-search/ 同じ「レシピ」は1ページに1つまで!(制約 条件) 違反したら減点!(ペナルティ) 1: recipe_A 2: recipe_A 3: recipe_B 10: recipe_C 1: recipe_A 3: recipe_B 10: recipe_C 2: recipe_A 元の検索結果 (Top-k) agents ... ...
Slide 21
Slide 21 text
● cookpad は今、「つくれぽ」をはじめ、サービス全体 のエコシステムの再構築に取り組んでいる ● 培ってきた資源を活かしながら、新しい価値を作るこ とに日々試行錯誤している まとめ