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 は今、「つくれぽ」をはじめ、サービス全体 のエコシステムの再構築に取り組んでいる ● 培ってきた資源を活かしながら、新しい価値を作るこ とに日々試行錯誤している まとめ