7

ランク付けする必要のある投稿が何千もあるReddit.comのようなWebサイトアルゴリズムをコーディングする方法を学ぼうとしています。彼らのランキングアルゴリズムはこのように機能します(あなたはそれを読む必要はありません、それは私が持っているより一般的な質問です): http: //amix.dk/blog/post/19588

現在、私はデータベースに投稿を保存しており、それらの日付を記録し、それぞれに賛成票と反対票のフィールドがあるので、それらの記録を保存しています。彼らのランキングをどのように保存するのか知りたいですか?特定の投稿にランキング値があるが、時間とともに変化する場合、どのようにランキングを保存できますか?

保存されていない場合、ユーザーがページを読み込むたびにすべての投稿をランク付けしますか?

投稿はいつ保存しますか?すべての投稿にx分ごとに新しい値を自動的に与えるcronジョブを実行しますか?それらの価値を保存しますか?これは一時的なものです。たぶん、その投稿が最小スコアに達して忘れられるまで?

4

3 に答える 3

6

あなたがそれらを表示するたびに私は間違いなくそれらのランクを計算しません。

シンプルでパフォーマンスの低いソリューションは、投稿のランキングをキャッシュすることです。1つの投稿のランキングが変更されたら、キャッシュをクリアまたは更新します。

それは理想的ではありませんが、可能です。

別の方法は、あなたがほのめかしたように行うことです:データベースにランクを計算して保存し(そして理想的にはそれらをキャッシュし)、そしてx分ごとにcronジョブを使用してそれらのランキングを更新します。

繰り返しますが、これらはあなたがやりたいことへの基本的なアプローチです。その後、時間をかけてそれらを構築することができます。

選択するアルゴリズムは、ほとんどの場合、ニーズに非常に固有のものになります。

また、適切なアルゴリズムを取得するために通過する必要のある長さの種類を決定するため、サイトが取得するトラフィックの種類を測定する必要があります。

于 2012-10-01T03:40:42.247 に答える
2

時間加重スケールで1票のスコアを即座に計算します。そのスコアをキューに送信するか、それを使用して、パフォーマンスの高いものに応じてフィールドをインクリメントします。

定期的に、現在ランク付けされているすべての記事と、時間枠内に投票を受け取ったすべての記事を取得し、ランク付けされたすべての記事に続いて、ランク付けの割り当てを満たすのに十分な計算が完了するまで、スコアの降順ですべてのキューに入れられた記事を再スコアリングします。 。

ランキングリストはキャッシュされ、次のランキングサイクルまで使用されます。サイトの負荷に基づいて、キューの保持期間(最後のNキューでアクティビティがあったものはすべて再キューに入れられる可能性があります)、記事の保持などを調整する必要がありますが、これはパフォーマンスの高い開始点である必要があります。

于 2012-10-01T03:49:56.123 に答える
1

redditが使用するのとまったく同じアルゴリズムを使用している場合は、アイテムが賛成または反対に投票されるたびに、実際には賛成票と反対票の差が桁違いに変わる場合にのみ、ランキングフィールドを変更する必要があります。この記事では、ランキングの仕組みについてもう少し説明します。

http://bibwild.wordpress.com/2012/05/08/reddit-story-ranking-algorithm/

基本的に、賛成票と反対票は投稿を「置き換える」ためだけに役立ちます。Dが賛成票と反対票の数の差である場合、投稿はDの桁ごとに12時間上下にシフトされます。それ以外は、単純な時間ランキングです。


ただし、投稿の年齢が線形以外の方法で重要な独自のランキングシステムを使用する場合は、インデックス付きフィールドを作成して、前述のように時間間隔でランキングを再計算するか、並べ替えを行う必要があります。コメントで述べたように、SQLクエリに追加します。しかし、チャンスは、それが何度も再計算される必要がない方法を見つけることができるということです。

于 2012-10-01T06:10:25.477 に答える