Upgrade to Pro — share decks privately, control downloads, hide ads and more …

新「つくれぽ」検索の開発について/Cookpad Tech Kitchen#24

新「つくれぽ」検索の開発について/Cookpad Tech Kitchen#24

Yusuke Naito

August 21, 2020
Tweet

Other Decks in Programming

Transcript

  1. 事業開発部 内藤雄介
    2020/08/21 Cookpad Tech Kitchen #24
    新「つくれぽ」検索の
    開発について

    View Slide

  2. ● 内藤 雄介 @9toon
    ● 14年新卒→(子会社化/転籍)→19年再入社
    ● 事業開発部サーチエンジニアリングG長
    ● バックエンドエンジニア
    ● 大阪からフルリモート
    自己紹介

    View Slide

  3. ● 新「つくれぽ」とは?
    ● 新「つくれぽ」の検索機能の開発について
    ○ 全文検索システムの選定
    ○ 検索精度向上の工夫
    ■ フィルタリング
    ■ ランキング
    今日お話すること

    View Slide

  4. 新「つくれぽ」とは?

    View Slide

  5. ● 2006年に誕生
    ● レシピ作者に「ありがとう」
    を伝える手段
    これまでの「つくれぽ」とは?

    View Slide

  6. 「感謝」から「みんなへのおすすめ」へ
    ref: 『13年続いた「つくれぽ」をリニューアルした話』

    View Slide

  7. 新「つくれぽ」とは?
    ● 「みんなへのおすすめ」の手段
    ● 他人が見ても楽しめるように
    リッチなフォーマットに進化
    ○ 3枚までの写真/動画
    ○ ハッシュタグ

    View Slide

  8. 新「つくれぽ」の検索機能の開発

    View Slide

  9. ● 世界最大級のRailsモノリス
    ● 「理由はよくわからないがとにかくこれをさわるだけ
    で開発期間が3倍になる」
    cookpad_all という魔境

    View Slide

  10. 「ふつう」のRails開発をするために
    ref: クックパッド開発者ブログ『モダンBFFを活用した既存APIサーバーの再構築』
    ● Microservices化
    ○ Rails 6.0.x
    ○ Ruby 2.6
    ○ Aurora MySQL...
    ● Orcha(BFF)を通して
    新旧APIを統合

    View Slide

  11. 検索システムも「身軽」にしたい
    ● レシピ検索にはSolrを長年利用している
    ● 既存検索システムの課題
    ○ 「人気順」等の大事な機能を支えるバッチ類やビジ
    ネスロジックが入り乱れていて触りづらい...
    ○ Solr4.9を使っていてかなり古かった(※当時)
    ● →別システムに切り出して開発したい
    ref: クックパッド開発者ブログ『レシピ検索を支えるレガシーでクリティカルな
    大規模バッチを刷新した話』

    View Slide

  12. 「いい検索システム」とは
    ● 「フィルタリング」✕「ランキング」
    ● フィルタリング:
    ○ 文書群の中から目的の文書をどう絞り込むか?
    ○ 全文検索では文章をどう単語に分割するかが重要
    ● ランキング:
    ○ 絞り込んだ文書をどう順序に並べるか?

    View Slide

  13. 検索エンジンをどう選定するか?
    ● Amazon Elasticsearch Service(AES)を採用した
    ○ いち早く検証に入りたい(構築コスト)
    ○ 開発に集中したい(運用コスト)
    ● 制約:
    ○ ユーザ辞書が使えない(※当時)
    ○ Close Index APIが使えない

    View Slide

  14. ● 「鶏もも肉のトマト煮」
    ○ 辞書なし(素の kuromoji)
    ■ 鶏もも_肉_の_トマト_煮
    ○ 辞書あり
    ■ 鶏もも肉_の_トマト煮
    ○ ↑料理ドメインでは頻出の「鶏もも肉」でも適切に
    分かち書きできない!
    ユーザー辞書の有無での形態素解析の差分

    View Slide

  15. Analyzerの働き
    1. Char filter(文字列のまま処理)
    ○ 例. HTML文字列の除去 etc.
    2. Tokenizer(文字列をトークン(単語)に分割)
    ○ 例. ngram, kuromoji, whitespace
    3. Token filter(トークンに対する処理)
    ○ 例. synonym(同義語の展開)

    View Slide

  16. ● レシピ検索で培った言語資源が gem 化されている
    ○ text_processor(MeCab+カスタム辞書のwrapper)
    ○ word_essence(後述)
    ● 「分かち書き」をアプリケーション側で行う
    ○ text_processor で分割して空白区切りに直す
    ○ Elasticsearchでは同義語の展開のみ行う
    ■ whitespace tokenizer + synonym token filter
    今回採用した方法

    View Slide

  17. 1. Elasticsearchを自前でHostする
    a. EC2上に構築する
    b. ECS上に構築する(cookpad mart はこれ)
    2. Elastic Cloudを利用する
    3. etc?
    他にどんな選択肢があった?
    ● カスタムプラグインを使う?
    ● NEologd や UniDic のような別の辞書を使う?
    ref: クックパッド開発者ブログ『サービス特性にあった検索システムの設計戦略』

    View Slide

  18. フィルタリングの工夫 - クエリ理解
    ● word_essence という社内 gem
    ○ ある単語がどういう属性なのかを判定できる
    ○ 例. メニュー名、原材料名、調味料 etc.
    ● 「トマト パスタ」は「原材料+メニュー名」と分かる
    ○ フレーズ検索に切り替える
    ■ ✕パスタ用トマト
    ■ ○トマト風味の地中海風パスタ

    View Slide

  19. ● 「つくれぽ」は人気の「レシピ」に集まりやすい
    ○ 単純に並べると、特定の「レシピ」への「つくれ
    ぽ」に検索結果が偏ってしまう
    ○ →「レシピを探す体験」が損なわれる
    ● ebay さんの技術記事を参考に、ページ内の「多様性」
    を制御するリランクの仕組みを導入
    ランキングの工夫 - Diversify
    ref: https://tech.ebayinc.com/engineering/diversity-in-search/

    View Slide

  20. リランク後の
    検索結果
    ランキングの工夫 - 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
    ...
    ...

    View Slide

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

    View Slide