簡體   English   中英

人氣,如何使新的點擊次數超過舊命中?

[英]Popularity, How to make new hits count more than old hits?

product_date_added每個產品都是Date字段,包含添加日期。 它們還有一個product_views ,它是一個int字段,包含產品被查看的次數。

為了按人氣顯示產品,我使用算法來計算產品每天的點擊次數。

SELECT 
    AVG(product_views / DATEDIFF(NOW(), product_date_added)) as avg_hits
    , product_table.* 
FROM product_table
WHERE product_available = "yes" 
GROUP BY product_id
ORDER BY avg_hits DESC

這有效,但老板注意到很多舊產品首先出現。 所以他基本上希望新視圖比舊視圖更重要。

他的建議是,任何一歲以上的觀點都不算數。 我想我必須保留每個視圖的日期才能做到這一點,我認為這會降低性能。

創建像我老板要求的流行度算法的最佳方法是什么?

理想情況下,我希望能夠提出一些不會改變表結構的東西。 如果那是不可能的,我至少想提出一個可以使用現有數據的解決方案,所以我們不是從0開始。如果那不可能,那么任何可行的方法都不可能。

你不會(因此)必須保留每個視圖的日期。 相反,您可以在包含列的表中為每個項目保留最多366行:product_id,day_of_year,count。 每天運行一項任務,將一年前的所有計數歸零。 如果您不介意非規范化數據,那么該任務還可以更新項目本身中的“計數”字段以便快速檢索,這樣您的查詢就不需要更改。 product_views只是product_views_in_the_last_year 1天的時間段是任意的 - 我懷疑你是否關心流行度是基於一年的窗口,所以我希望它也可以是一小時,一周或兩周,這取決於你有多少桶?我願意處理。

另一種方案可能是使用指數衰減。 將計數字段轉換為十進制類型。 每天一次,將每個項目的數量減少一個固定的百分比(小於1%,大於0.1%),以便命中越近,它的“重量”越多。 如此古老的人氣永遠不會完全消亡,但一年前的點擊量不會有多大貢獻。 順便提一下,這個方案的一個等價是保持代碼不變,但確保您的網站整體上隨着時間的推移變得越來越受歡迎;-)

至於避免從零開始 - 可能會立即減少每個項目的計數,作為一次性操作,取決於項目的年齡。 總的來說,您希望舊對象具有較舊的視圖,因此被當前方案評級過高。 這不是萬無一失的,因為可能一些較舊的物品最近獲得了大量的點擊。 您可以通過查看最近的Web服務器日志來識別這些項目,或者在執行一次性減少之前花費一周或一個月計算命中數。 即使沒有這樣做,如果有一個根本原因讓他們受歡迎(不僅僅是因為他們目前在你的排名中排名很高,因此從看着你“最受歡迎”圖表的人那里獲得流量),那么希望他們能夠恢復時間。

您可能想查看此博客文章 它的目標是App Engine,但技術很普遍。 基本方法是使流行度呈指數衰減,並在您記錄投票/下載/任何時候增加。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM