はじめに
ECサイトで商品を1点だけ買ってもらえたとき、「一緒に使うあの商品も提案できていたら」と感じたことはないでしょうか。実店舗なら自然にできる「こちらも合わせてどうですか」という一声を、ECサイトでは仕組みとして用意しておく必要があります。
この記事では、モーターサイクル用品を扱うECサイトで実装した、組み合わせて使える商品を自動で提案する「Complete the Fit」機能について、どんなルールで商品を選び、どうやって表示の速さを保っているのかを解説します。読み終わる頃には、コーディネート提案を自分のサイトに置き換えて考えられるようになるはずです。
Complete the Fit とは何か
「合わせて使える商品」を自動で提案する機能
Complete the Fit は、いま見ている商品と組み合わせて使える商品を提案する機能です。ジャケットを見ているユーザーには「このジャケットに合うパンツ、グローブ、ブーツはいかがですか」という形で、商品ページの下部に候補を並べます。ユーザーが自分でサイト内を探し回らなくても、次の一品が目の前に出てくる状態を作るのが狙いです。装備一式をそろえる必要があるモーターサイクル用品とは、特に相性のいい提案方法なんですよね。
人がおすすめを登録する方式との違い
コーディネート提案というと、商品ごとに担当者が「おすすめの組み合わせ」を手作業で登録する方式を思い浮かべるかもしれません。ただ、その方式は商品数が増えるほど登録と更新の手間が膨らみ、登録漏れの商品には何も表示されなくなります。今回は商品が持つ属性(性別・シーズンなど)からルールで自動的に候補を選ぶ方式にしました。新商品を追加しても、属性さえ入っていれば提案に自動で組み込まれます。
マッチングルールの組み立て方
一致させる3つの条件
提案する商品は、いま見ている商品と次の3つが一致するものから選びます。
- 性別: 同じ性別の商品(メンズならメンズ)
- シーズン: 同じシーズンの商品(秋冬なら秋冬、または通年)
- スポーツ種別: 同じスポーツ向けの商品(モーターサイクルならモーターサイクル)
メンズの冬用ジャケットに、レディースの夏用グローブを提案しても組み合わせになりません。「一緒に使って違和感がないこと」を、この3条件で担保しています。
除外する2つの条件
一致条件と同じくらい大事なのが、外す条件です。閲覧中の商品と同じカテゴリと、いま見ている商品そのものは候補から除外します。ジャケットを見ている人への「別のジャケット」は、コーディネートではなく乗り換えの提案になってしまうためです。
表のとおり、見ている商品と同じ種類の商品は提案から自動的に外れる、というルールです。
毎回同じ顔ぶれにしないランダム表示
条件に合う商品が多いカテゴリでは、上位の数件だけを固定で出すと、何度訪れても同じ商品が並ぶことになります。そこで、条件を満たした候補の中からランダムに選んで表示する形にしました。ページを開き直すたびに顔ぶれが少し変わるので、再訪したユーザーにも新しい発見があります。露出する商品が偏らない、という運営側の利点もあります。
表示の速さを支えるデータの持ち方
商品インデックス(索引)を先に作っておく
マッチングのたびに全商品のデータをShopify(商品データを預けているECの基盤サービス)へ問い合わせると、商品数によっては表示に時間がかかります。そこで、マッチングに必要な情報だけを抜き出した**インデックス(索引)**をあらかじめ作って保存しておき、提案時はそこから探す形にしました。索引に入れているのは、商品ID・URL・タイトル・価格・画像・カテゴリ・性別・シーズン・スポーツ種別だけ。本棚の全部の本を開かなくても、目録を見れば目当ての本が見つかる、という考え方です。
結果のキャッシュで問い合わせを減らす
一度計算したレコメンド結果は、一定時間キャッシュ(結果の一時的な作り置き)として使い回します。人気商品のページに短時間でアクセスが集中しても、毎回計算し直さずに済むため、表示速度と裏側の負荷の両方を抑えられます。ランダム表示との兼ね合いは、キャッシュの有効時間を短めにすることで調整しました。
構成図
流れを一言でまとめると、いま見ている商品の属性を鍵にして、先に作っておいた索引から「一緒に使える別カテゴリの商品」を選び出して表示する、という処理です。
まとめ
Complete the Fit の中身は、「性別・シーズン・スポーツ種別を合わせ、カテゴリを外す」というシンプルなルールと、索引・キャッシュによる高速化の組み合わせでした。複雑なAIによる予測を使わなくても、商品属性を整理してルール化するだけで、実用的なコーディネート提案は成立します。まずは自社の商品にどんな属性があるかを書き出してみるのが、最初の一歩としておすすめです。