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