だから私は、かなりユニークな問題だと私が信じているものを持っています。非常に大きなアイテム テーブル (200,000ish) のランキングを計算する必要があります。それらの「ランク」は、一緒に追加されたいくつかの加重属性に基づいています。1 から 4 のスケール (四分位 1 下位四分位 4 上位に基づく) の 7 つの属性は、最初は均等に重み付けされてから加算されます (7 から 28 のスケール)。ユーザーが属性の重みを調整できるようにして、属性の一部またはすべてを 2 倍または 1/2 の重要度にできるようにしたいと考えています。これにより、最終ランキングが変わる可能性があります。誰かが同様の問題に対処したかどうか、またはどこから始めるべきかについて何か考えがあるかどうかを確認しています。ありがとう!
2 に答える
基本的な設計として、私はあなたの元のアイテムをデフォルトのランキングと共に変更できないようにしようと思います。
次に、cron でスクリプトを実行して、一定間隔でランクを計算します。これは、選択したアルゴリズムによって行われますが、例としては次のとおりです。
アイテムに次のプロパティがあるとします {"someRetailListing":{ "id": "1", "price": "100000.12", "city": "New York City", "rooms": "4", .. . "rankCity": 4, "rankPrice": 3, "rankQuality": 3 } スクリプトを初めて実行したとき、その合計ランクは 20/30 です
ここで、ユーザーがやって来て入力を追加し、その送信を別のバケット (または同じバケット内のタイプ) に保存します: { "type":"userRank" "uid": 3121, "propertyID": 1 "rankCity": 3, "rankPrice": 1, "rankQuality": 3 } スクリプトを実行するとき、おそらくランクの 50% をユーザーから取得し、デフォルトから 50% を取得する必要があります。したがって、すべてのユーザー結果を合計して平均ユーザー スコアを取得し、自分のスコアとマージして、ほぼ好きなことを行うことができます。
この最終結果を保存します { "type": "userPropertyRank", "propertyID": 1 "rankCity": 3, "rankPrice": 3, "rankQuality": 3 }
ランキングの基本構造は、変数を使用したソート クエリです。ユーザーの入力をランキングに組み込むだけです。
クエリは次のようになります。
select t.*, (@rn := @rn + 1) as ranking
from (select t.*, (@v1 * col1 + @v2 * col2 . . .) as ranking
from table t
) t cross join
(select @rn := 0) params
order by ranking;
これはデータベースで簡単に実行できます。正しい変数を渡すだけです。