Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
新「つくれぽ」検索の開発について/Cookpad Tech Kitchen#24
Search
Yusuke Naito
August 21, 2020
Programming
1
700
新「つくれぽ」検索の開発について/Cookpad Tech Kitchen#24
Yusuke Naito
August 21, 2020
Tweet
Share
Other Decks in Programming
See All in Programming
GC25 Recap: The Code You Reviewed is Not the Code You Built / #newt_gophercon_tour
mazrean
0
140
Swift Concurrency 年表クイズ
omochi
3
220
When Dependencies Fail: Building Antifragile Applications in a Fragile World
selcukusta
0
120
Kotlin 2.2が切り拓く: コンテキストパラメータで書く関数型DSLと新しい依存管理のかたち
knih
0
240
はじめてのDSPy - 言語モデルを『プロンプト』ではなく『プログラミング』するための仕組み
masahiro_nishimi
4
18k
CSC509 Lecture 08
javiergs
PRO
0
280
Towards Transactional Buffering of CDC Events @ Flink Forward 2025 Barcelona Spain
hpgrahsl
0
120
alien-signals と自作 OSS で実現する フレームワーク非依存な ロジック共通化の探求 / Exploring Framework-Agnostic Logic Sharing with alien-signals and Custom OSS
aoseyuu
3
5.4k
ドメイン駆動設計のエッセンス
masuda220
PRO
15
7.4k
Claude Agent SDK を使ってみよう
hyshu
0
1.5k
業務でAIを使いたい話
hnw
0
220
CSC305 Lecture 10
javiergs
PRO
0
330
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
135
9.6k
Code Review Best Practice
trishagee
72
19k
Why Our Code Smells
bkeepers
PRO
340
57k
Navigating Team Friction
lara
190
15k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Documentation Writing (for coders)
carmenintech
76
5.1k
Designing for Performance
lara
610
69k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.7k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
14k
RailsConf 2023
tenderlove
30
1.3k
How to Ace a Technical Interview
jacobian
280
24k
The Language of Interfaces
destraynor
162
25k
Transcript
事業開発部 内藤雄介 2020/08/21 Cookpad Tech Kitchen #24 新「つくれぽ」検索の 開発について
• 内藤 雄介 @9toon • 14年新卒→(子会社化/転籍)→19年再入社 • 事業開発部サーチエンジニアリングG長 • バックエンドエンジニア
• 大阪からフルリモート 自己紹介
• 新「つくれぽ」とは? • 新「つくれぽ」の検索機能の開発について ◦ 全文検索システムの選定 ◦ 検索精度向上の工夫 ▪ フィルタリング
▪ ランキング 今日お話すること
新「つくれぽ」とは?
• 2006年に誕生 • レシピ作者に「ありがとう」 を伝える手段 これまでの「つくれぽ」とは?
「感謝」から「みんなへのおすすめ」へ ref: 『13年続いた「つくれぽ」をリニューアルした話』
新「つくれぽ」とは? • 「みんなへのおすすめ」の手段 • 他人が見ても楽しめるように リッチなフォーマットに進化 ◦ 3枚までの写真/動画 ◦ ハッシュタグ
新「つくれぽ」の検索機能の開発
• 世界最大級のRailsモノリス • 「理由はよくわからないがとにかくこれをさわるだけ で開発期間が3倍になる」 cookpad_all という魔境
「ふつう」のRails開発をするために ref: クックパッド開発者ブログ『モダンBFFを活用した既存APIサーバーの再構築』 • Microservices化 ◦ Rails 6.0.x ◦ Ruby
2.6 ◦ Aurora MySQL... • Orcha(BFF)を通して 新旧APIを統合
検索システムも「身軽」にしたい • レシピ検索にはSolrを長年利用している • 既存検索システムの課題 ◦ 「人気順」等の大事な機能を支えるバッチ類やビジ ネスロジックが入り乱れていて触りづらい... ◦ Solr4.9を使っていてかなり古かった(※当時)
• →別システムに切り出して開発したい ref: クックパッド開発者ブログ『レシピ検索を支えるレガシーでクリティカルな 大規模バッチを刷新した話』
「いい検索システム」とは • 「フィルタリング」✕「ランキング」 • フィルタリング: ◦ 文書群の中から目的の文書をどう絞り込むか? ◦ 全文検索では文章をどう単語に分割するかが重要 •
ランキング: ◦ 絞り込んだ文書をどう順序に並べるか?
検索エンジンをどう選定するか? • Amazon Elasticsearch Service(AES)を採用した ◦ いち早く検証に入りたい(構築コスト) ◦ 開発に集中したい(運用コスト) •
制約: ◦ ユーザ辞書が使えない(※当時) ◦ Close Index APIが使えない
• 「鶏もも肉のトマト煮」 ◦ 辞書なし(素の kuromoji) ▪ 鶏もも_肉_の_トマト_煮 ◦ 辞書あり ▪
鶏もも肉_の_トマト煮 ◦ ↑料理ドメインでは頻出の「鶏もも肉」でも適切に 分かち書きできない! ユーザー辞書の有無での形態素解析の差分
Analyzerの働き 1. Char filter(文字列のまま処理) ◦ 例. HTML文字列の除去 etc. 2. Tokenizer(文字列をトークン(単語)に分割)
◦ 例. ngram, kuromoji, whitespace 3. Token filter(トークンに対する処理) ◦ 例. synonym(同義語の展開)
• レシピ検索で培った言語資源が gem 化されている ◦ text_processor(MeCab+カスタム辞書のwrapper) ◦ word_essence(後述) • 「分かち書き」をアプリケーション側で行う
◦ text_processor で分割して空白区切りに直す ◦ Elasticsearchでは同義語の展開のみ行う ▪ whitespace tokenizer + synonym token filter 今回採用した方法
1. Elasticsearchを自前でHostする a. EC2上に構築する b. ECS上に構築する(cookpad mart はこれ) 2. Elastic
Cloudを利用する 3. etc? 他にどんな選択肢があった? • カスタムプラグインを使う? • NEologd や UniDic のような別の辞書を使う? ref: クックパッド開発者ブログ『サービス特性にあった検索システムの設計戦略』
フィルタリングの工夫 - クエリ理解 • word_essence という社内 gem ◦ ある単語がどういう属性なのかを判定できる ◦
例. メニュー名、原材料名、調味料 etc. • 「トマト パスタ」は「原材料+メニュー名」と分かる ◦ フレーズ検索に切り替える ▪ ✕パスタ用トマト ▪ ◦トマト風味の地中海風パスタ
• 「つくれぽ」は人気の「レシピ」に集まりやすい ◦ 単純に並べると、特定の「レシピ」への「つくれ ぽ」に検索結果が偏ってしまう ◦ →「レシピを探す体験」が損なわれる • ebay さんの技術記事を参考に、ページ内の「多様性」
を制御するリランクの仕組みを導入 ランキングの工夫 - Diversify ref: https://tech.ebayinc.com/engineering/diversity-in-search/
リランク後の 検索結果 ランキングの工夫 - 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 ... ...
• cookpad は今、「つくれぽ」をはじめ、サービス全体 のエコシステムの再構築に取り組んでいる • 培ってきた資源を活かしながら、新しい価値を作るこ とに日々試行錯誤している まとめ