ラクマのAndroidアプリの検索オートコンプリート機能を改善した話

自己紹介

はじめまして。ラクマでAndroidエンジニアをしている者です。
趣味は筋肉トレーニングです 💪

環境

Android Studio 4.1.1

記事の目的

ラクマAndoridは、2014年から続くサービスのため、レガシーなコードもいくつかありますが、基本的なアーキテクチャはMVVMを採用しています。 本稿ではMVVMアーキテクチャを使用して、ラクマの検索オートコンプリートがどう改善されたか記載させていただきます。

背景

皆さんはインターネットで買い物をする際、欲しい商品がなかなか見つからない、検索できない、これじゃないんだけどな。という歯がゆい思いを一度は体験したことはありませんか? ラクマではそのようなマイナス体験を減らし、よりユーザーの方がいち早く商品にたどりつけるようにするため、検索周りの改善に日々取り組んでおります。

そんなプロジェクトのひとつとして「検索オートコンプリート」の改善プロジェクトに携わる機会をいただいたので、ラクマのコアバリューである「User First」を推めた 改善内容を機能紹介と共にまとめてみようと筆を執りました。

f:id:Rakuma:20210202110851p:plain

構成

前置きとしてラクマAndroidのアーキテクチャについて軽くご紹介します。ラクマAndoridの方針としてMVVMが推奨されているため、基本的にMVVMで構成されています。テスタブルであることなど理由は様々ありますが、具体的な詳細につきましてはまたの機会にご説明したいと思っております。

フロー

オートコンプリートのフローとしてはざっくり下記のようになります。

f:id:Rakuma:20210202111422p:plain

EditTextのonTextChangedがテキスト欄にテキストを入力することで発火され、ViewModel側でTextChangeのイベントを受け取り、Repository経由で検索クエリをAPIにCallするという運びです。 結果としてそのクエリにそったデータが返ってくることになります。 また、Repository内では引数として受け取った検索クエリをkeyとして検索結果をキャッシュしています。 オートコンプリートの性質上、キーワード変更がかかる段階で都度検索結果を更新しないといけないため、一度検索したものであっても都度APIに問い合わせをすると サーバーへの負荷が大きくなります。そこで一度入力したキーワードの結果に関してはキャッシュしたものを返している形をとっています。

修正前

f:id:Rakuma:20210202111508p:plain:w300

修正前は ブランド よく検索されているキーワード を分けて表示していましたが、その後の検索結果画面で絞り込みをする方が一定数いました。 そこで、最初から絞り込んだ結果を表示してあげることで手間を軽減できるのではないかと、改善に着手することになりました。

修正内容

よりスムーズに絞り込まれた検索結果にたどり着けるようにするため、オートコンプリートする結果のレイアウトにカテゴリ・ブランドを含めようというのが今回の改善になります。 

<変更前のオートコンプリート>  
・キーワード補完  
・ブランド名補完  
<変更後のオートコンプリート>  
・キーワード補完  
・キーワード補完 + カテゴリ補完  
・キーワード補完 + ブランド補完  

今回の改修のポイントとして、既存項目に ブランドよく検索されているキーワード が存在していますが、共にテキストとイメージだけのレイアウトで共通のテキスト・イメージのデータを持つモデルを扱っていました。

f:id:Rakuma:20210202131953p:plain

上記説明にもありましたが、今回は扱うデータによってカテゴリが含まれていたり、ブランドが含まれていたりするため、共通する部分は切り出し、各レイアウトの種類に合わせてモデルを設計したところにあります。 そうすることでビジネス要件が変わり、例えば画像だけ表示するオートコンプリートをだしたい!なんてことになっても、他のモデルに影響を与えることはなくなると考えました。

f:id:Rakuma:20210202132525p:plain

幸い、ビジネスロジックがViewと疎結合になっていたこともあり、改修に時間はかかりませんでした。 Repositoryパターンで設計されているのでRepositoryで加工したデータをレイアウトの構成タイプに合わせて返すだけでView側にはレイアウトの追加以外で手を入れることはほとんどありませんでした。

修正した結果

修正した結果が下記です。

f:id:Rakuma:20210202111543p:plain:w300

今回の改修により、キーワードだけでなく、カテゴリ・ブランドでの絞り込みも合わせて提示するようになりました。 これによって、今までよりも簡単に、絞り込まれた結果にたどり着くことができるようになりました。

学びと今後の展開

今回の学びとしてロジックの切り離しや最初のモデルの設計がとても大事だということがわかりました。 もともとのオートコンプリートの機能が変更に強い設計だったおかげであまり手をいれずに済んだことが今回の結果につながったのではないかと考えています。

今回のオートコンプリート機能の他にも、よりよい検索体験を目指して、様々な改善を実施していく予定です。 今後もラクマの機能改善を通してUser Firstを体現し、価値を提供していきたいと思います。

また、ラクマでは、User Firstをコア・バリューの一つに掲げ、一緒にアプリ開発をしてくれるメンバーを募集しています。

カジュアル面談で、私達のチームについて紹介させて頂きます。