2011-12-03 53 views
1

我有一個相當標準的搜索查詢來查找相關內容。除其他外,它根據文章標題和內容的相關性以及類別等來分配評分。所有漂亮標準的內容。我還想根據文章的發表日期添加一個加權「新鮮度」。如何在MySQL搜索中重新排列日期新鮮度?

如何才能將文章的發佈「日期時間」縮短爲可作爲總體分數的一部分進行比較的分數。注:分數必須MATCH()反對等

現有成績的順序進行選擇:

SELECT *, 
MATCH (content) AGAINST ('some keywords from content')) *1 + 
(MATCH (title) AGAINST ('some kewords from title ')) * 1.5 + 
COUNT(matching_terms) *3, 1)/5.5 
AS score 
FROM ....` 

回答

4

以下函數將日期差異縮小到期望值的給定範圍,範圍從.5到3年內的最大值約爲3。然後可以給它一個負面的重量來喜歡新鮮感。

SELECT *, (LN(LN(-1/(datediff(published_time, now())+1)) + 1) 

在三年的過程中的得分。

Wolfram alpha

一個月以上的得分

The score over one month

兩個LN()功能是確保有在5-6的範圍內的上限,以保持它比一個更小的典型的比賽得分。它還會對其進行加權,使得比2周更新的文章更受歡迎。單個LN()的範圍大約在.5 - 9之間,首選30天。

+0

爲postgres做這個工作嗎? – light24bulbs

+0

理論上,是的,而不是現在()你會使用「CURRENT_TIMESTAMP」和DATEDIFF()將需要被替換爲postgres版本:http://www.sqlines.com/postgresql/how-to/datediff –

1

減去從現在得到「年齡」,並轉換爲數字,例如

select 1/((now()+0 - published_date_field) as number) * your_weighting_factor; 
+0

返回的數字太大而不能很好地縮放。 –

+0

我改變了公式1/ –

0

應用的得分另一個計算,如: -

select 
(...) + (datediff(published_time, now()) <-- diff in days 
as score 

上面的例子總是舊的故事倒推的DATEDIFF
總是會返回零或負值。