2015-03-03 101 views
1

我想創建一個基本的排序算法,根據mongodb和meteor中的相關性確定。但是,我無法將其靜態存儲並更新它,因爲它將當前時間用作參數之一。MongoDB:按相關性功能排序

理想的情況下,想什麼我有是一樣的東西如下:

Post.relevance = function(magnitude) { 
    magnitude = magnitude || 1.8; 
    check(magnitude, Number); 
    var score = this.upvotes - this.downvotes; 
    var hoursAgo = moment().hours - moment(this.createdAt).hours(); 
    return (score - 1)/Math.pow((hoursAgo + 2), magnitude); 
} 

從我所收集的,我將不得不使用aggregation pipeline生成這個查詢,但我不能完全得到我的帖子頁面的詳細信息。

如何使用mongodb生成此高級查詢?

+0

如果我理解正確,您希望爲每個帖子生成相關屬性,然後按相關性(定量)對信息進行排序和過濾?另外,你的數據庫的模式是什麼? – 2015-03-03 14:24:13

+0

是的,我希望人們去首頁,並首先看到最相關的帖子,按功能排序。數據庫的架構目前只有帖子,用戶和評論。帖子包含「title」,「link」,「authorId」,「createdAt」,「editedAt」,「upvotes」和「downvotes」 – corvid 2015-03-03 14:26:28

回答

3

該算法取決於您如何定義相關性。

在開始之前,我想提一下,我之前沒有在生產環境中實現過這樣的算法,我只表達我個人對於如何解決這個問題的看法。

個人而言,根據您的模式,我會考慮下面的方法是最常見的確定的相關性:

  • 關聯的人來說 - 這是搜索引擎 如何確定內容的相關性:更多的意見網站,在 更相關的是
  • 相關性在質量方面 - 在你的情況,你可以去一個動態生成算法upvotes條款/ downvotes比
  • 時間相關性 - 你的方式目前正在量化e相關性,使用一種使用時間作爲過濾機制的算法;仍然,我不會去與這一個,因爲相關的內容將永遠是有價值的

在前面提到的三種情況中,我會建議你去混合前兩個。

您必須找到一種很好的方式來表示視圖流行度,upvotes和downvotes之間的關係。這意味着,你必須先更新數據庫架構,以便它持有的觀看次數爲每一個職位:

{ 
    _id: ObjectId(...), 
    title: 'A Random Post', 
    authorId: ObjectId(...), 
    createdAt: '01-01-1900', 
    editedAt: '02-01-1900', 
    upvotes: 76, 
    downvotes: 15, 
    viewCount: 8655, 
    relevance: 

} 

之後,就可以判斷一個公式來計算的相關性。例如,如果你假設更多的意見後得到,比較流行的是,你可以用下面的公式:

Relevance = viewCount * upvotes/downvotes 

不過,最重要的是你如何選擇存儲的相關屬性。

在我看來,你有兩個可能的選擇:

  • 存儲在數據庫和其他所有元素 - 這 意思是,你必須不斷地更新每個 後的相關性,而連續發出$inc的更新的觀看次數, upvotes和downvotes
  • 確定查詢數據庫 - 唯一的問題對觀看次數,使用upvotes和downvotes $inc更新後的相關性;從數據庫中提取 數據後,你將不得不解析產生 陣列和量化的相關性,而無需在數據庫中存儲它

顯然,第一種情形會產生由於在服務器上多了很多應變到更多數量的更新操作。不過,它可以讓你通過發起一個簡單的查詢來查詢相關的帖子。

//Top 10 most relevant posts 
db.posts.find({}).sort({ relevance: -1 }).limit(10); 

如果使用第二個選項去,你首先必須把所有從數據庫中的文檔,然後做一些額外的工作來確定的相關性,從服務器發送數據之前。