良い一日、
これが私のユースケースです。各ユーザーは、アイテムのウィッシュリストと、提供しているアイテムの目録を持っています。アイテムの数は決まった数ですが、ユーザーは何人でもかまいません。
私の目標は、ログインしたユーザーに、アルゴリズムに基づいて、自分のウィッシュリストに一致する在庫を持つユーザーの推奨事項またはリストを提供することです。注意点は、ウィッシュ リストに基づいて最も完全なオファーを持っているユーザーが一番上に表示され、降順に並べ替えられるように、結果を並べ替えることができる必要があるということです。これをページ分割された方法で提示できるようにする必要があるため、コモディティ仮想サーバー仕様を使用してクエリが 3 秒以内に終了できることを願っています。
ここで私のデータについて説明します。簡単にするために、各ユーザーのウィッシュリストのアイテム数を 35 個、インベントリのアイテム数を 250 個に制限するとします。私のテストデータでは、制限に基づいてランダムなウィッシュリスト/在庫数を持つ 5 万人のユーザーをそれぞれ入力しました。これを MySQL の結合でマッピングしたところ、このテスト データで約 700 万の関係が得られました。好奇心から、ウィッシュリストに 35 個のアイテムを持っているユーザーの ID を使用して、ウィッシュリスト テーブルと在庫テーブルを結合して、データベースにクエリを実行しようとしました。関連するすべての列で最も最適化されたクエリ パターンとインデックスを使用しても、空の Rackspace 仮想サーバー (2GB RAM、1vCPU) でクエリを完了するのに 21 秒かかりました。ハードウェアがボトルネックではなかったことを知るために、
グラフ データベースの使用を決定する前にすべてを試したことを確認するために、MongoDB で同じテストを行いました。マッチング アルゴリズムを適用できる唯一の方法は、MapReduce を使用することでした。私の自宅のコンピューターでは3秒でしたが、リモートサーバーでは9秒のクエリになりました。MapReduce はサーバーに非常に負担がかかるため、私のユース ケースではまだ実行可能ではありません。500 人のユーザーが同時にクエリを実行していると想像してください。
今私が話しているアルゴリズムに:
- ユーザーのウィッシュリストにあるものをすべて取得し、それらのアイテムを提供しているユーザーのリストを取得します。
- ユーザーごとに、ウィッシュリストのアイテムと一致するすべてのアイテムを取得します。要求された以上のアイテムを提供している場合は、希望の数量を使用します。
- これらのカウントを集計して、一致したウィッシュリストの最終的なパーセンテージを取得します。
いくつかのサンプルデータを見てみましょう:
# users
------------
uid | name
------------
1 | Ramon
2 | Mark
3 | Ralph
------------
# wishlist
--------------------------
pkid | uid | item_id | qty
--------------------------
1 | 1 | 1 | 2
2 | 1 | 2 | 5
3 | 1 | 3 | 1
--------------------------
# offers
--------------------------
pkid | uid | item_id | qty
--------------------------
1 | 2 | 1 | 1
2 | 3 | 2 | 2
2 | 2 | 3 | 7
これにより、次のようにグラフを設計するようになりました。
ノードから始めてRamon
、グラフをトラバースして、私にオファーを持っている他のユーザーを取得します。以下は、集計前の暫定的な結果です。
uid | item_id | wishlist_qty | offer_qty
----------------------------------------
2 | 1 | 2 | 1
2 | 3 | 1 | 1 # this should be 7 but we only need 1
3 | 2 | 5 | 2
----------------------------------------
上記のデータを使用して、次のようにして、ユーザーのウィッシュリストを最も多く持っているユーザーを定式化できます。
sum(offer_qty) / sum(wishlist_qty)
次に、この結果に基づいてユーザーを降順にランク付けすると、次のようになります。
uid | percentage
----------------
2 | 0.67
3 | 0.4
----------------
以上が、私が実現したいレコメンデーション アルゴリズムです。私はグラフデータベースを初めて使用するので、これが達成可能であり、意図した環境とユーザー数でうまく機能する場合は、正しい方向に微調整する必要があります. 他の提案がある場合は、列ストアなどの他の種類のデータベースを使用するか、データ モデルを変更して、このユース ケースと意図した環境で機能するようにすることをお勧めします。私のシナリオで。
プログラミングの問題を完全に説明できたことを願っています。ご回答ありがとうございます。
ラモン