事業開発部 内藤雄介2020/08/21 Cookpad Tech Kitchen #24新「つくれぽ」検索の開発について
View Slide
● 内藤 雄介 @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, whitespace3. 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 さんの技術記事を参考に、ページ内の「多様性」を制御するリランクの仕組みを導入ランキングの工夫 - Diversifyref: https://tech.ebayinc.com/engineering/diversity-in-search/
リランク後の検索結果ランキングの工夫 - Diversifyref: https://tech.ebayinc.com/engineering/diversity-in-search/同じ「レシピ」は1ページに1つまで!(制約条件)違反したら減点!(ペナルティ)1: recipe_A2: recipe_A3: recipe_B10: recipe_C1: recipe_A3: recipe_B10: recipe_C2: recipe_A元の検索結果(Top-k)agents......
● cookpad は今、「つくれぽ」をはじめ、サービス全体のエコシステムの再構築に取り組んでいる● 培ってきた資源を活かしながら、新しい価値を作ることに日々試行錯誤しているまとめ