2015-07-03 99 views
1

就我而言,我想根據趨勢過濾搜索結果(僅基於上升時間和時間)。如何按「趨勢」對搜索結果排序?

下面是實現 「趨向一種」 網站的一些例子:

http://8tracks.com/explore/all

https://news.ycombinator.com/news

https://www.reddit.com/

兩個選項我看到:

1。實時計算分數(每頁加載)

這是我目前的解決方案。每頁加載都會調用一個MySQL查詢併爲表中的每一行計算得分。這似乎是最準確的實時方法。問題是要比較的項目越多,需要的時間越長。現在有大約1.2mil的行,需要3秒鐘。在生產場景中,我瞄準< 100-300毫秒。

2.安排運行每X分鐘和預先計算的分數

這似乎是一個很好的解決方案,但很明顯的問題,我看到的是,你在哪裏存放結果的任務嗎?更新數據庫中的每一行需要很長時間(我有大約1.2mil行)。

廣泛的谷歌搜索幫助我確定使用哪種趨勢算法,但不知道如何在生產場景中實現它。

這裏是我的數據庫的一個簡單的例子:

table_topic 
id 
title 


table_upvotes 
topic_id 
user_id 
created_at 

這裏是實際的評分算法(http://amix.dk/blog/post/19574):

exports.hackerHot = function (gravity) { 
    if (gravity == null) { 
    gravity = 1.8; 
    } 
    return function (votes, itemDate) { 
    var hourAge = (Date.now() - itemDate.getTime())/(1000 * 3600); 
    return (votes - 1)/Math.pow(hourAge + 2, gravity); 
    }; 
}; 
+0

趨勢還是僅基於upvotes?趨勢=數學,upvotes =排序... –

回答

0

如果基於時間,因此「趨勢」爲「了例如,如果您只計算相關行的分數而不計算整個數據庫的分數,那麼您應該得到很好的性能提升,從而使其可以即時完成。

而我唯一理解的其他解釋是按upvote count排序,所以這不應該花太多時間,所以應該可以在飛行中做到這一點。

如果你想要更詳細的答案,你將不得不詳細說明你選擇實現的確切算法。

+0

謝謝。我編輯了這個問題以包含使用的實際算法。你的方法可能會更好。從「created_at」日期開始計算所有upvotes,然後對分數進行標準化並對它們進行比較,而不是計算最近X小時內的upvotes數量。 –

+0

我將不得不運行測試並比較性能。 您是否看到任何可能的解決方案不涉及即時計算? –