2012-02-23 38 views
0

我正在研究ASP.NET MVC中的一個Web應用程序,它涉及一個相當複雜的(我認爲)搜索情況。基本上,我有一堆標題和內容的條目。這些是我想要提供全文搜索的字段。值得注意的是,我還記錄了對這些條目的評分(如提高投票/反對投票)。我使用MongoDB作爲數據庫,併爲所有這些投票單獨收集。我計劃使用map/reduce函數將投票集合中的所有文檔變成文章的單個「分數」。當我進行搜索時,我希望文章的分數對排名有影響。全文搜索與不斷更新的數據

我一直在尋找很多不同的全文搜索服務,它看起來像所有的酷孩子都使用Lucene(在我的情況下,Lucene.NET)。問題是因爲當我首先創建索引時,得分不是文檔的一部分,所以我不知道如何設置Lucene。每次有人投稿時,我是否需要更新Lucene索引?我有點迷失在這裏。

我還沒有編寫任何此代碼,所以如果你有更好的方法來解決這個問題,請分享。

回答

3

的問題是,由於分數是不是當我 將首先創建索引的文檔的一部分,我不知道我怎麼會設立的Lucene

什麼問題?只需使用默認值進行評分/投票(可能爲0),稍後人們會投票更新它。

每次有人投稿時,是否需要更新 Lucene索引?

不,這可能是昂貴和緩慢。在你的應用程序中可能會有大量的更新,當你經常刷新到磁盤時,lucene可能會很慢。一般來說,幾乎所有的全文搜索實時更新都不如全文搜索那麼重要。所以我建議以下策略:

解決方案#1:

1,創建集MongoDB中,您將存儲與Lucene的所有更新:

{ 
    _id, 
    title, 
    content, 
    rating, //increment it 
    status(new, updated, delete) // you need this for lucene 
} 

2.After爲此,你需要創建工具將在後臺處理所有這些更新(例如,每10分鐘一次)。請記住,您需要將數據刷新到光盤,例如,在lucene更新/插入/刪除10000之後,可以快速更新lucene索引。

使用上述解決方案,您的數據可以陳舊10分鐘,但插入速度會更快。

解決方案2:

  1. 相關Lucene的每次更新發送異步消息。
  2. 處理此消息並每次更新lucene一次消息到來
  3. 異步處理非常重要,否則會影響應用程序的性能。

我會去#1,因爲它應該是更便宜的服務器。

選擇你喜歡的更多。

+0

基本上創建一個隊列。我喜歡。 – 2012-02-23 21:36:16

0

直接進入MongoDB或數據庫並遞增和遞減投票。在我看來,你必須不斷更新數據庫。不需要變得複雜。添加一些東西,在數據庫中添加一些東西。更新,插入,刪除所有的時間,如果有網站的變化。需要跟蹤更改並且跟蹤地點位於mongodb或sql數據庫中。對於搜索字段,請使用mongodb字段搜索參數併合並它返回的所有字段並自行排列它們。

+0

是的,我認爲你可能是正確的遞增和遞減選票。但是,我需要比可用的mongodb更高級的搜索。詞幹和短語搜索可用於全文搜索工具,但不能用於簡單的mongodb查詢。 – 2012-02-23 04:40:54

+0

重要的是你想用全文搜索去詳細。將查詢拆分爲單詞,抽取每個單詞的所有條目並對它們進行排名並獲取查詢詞最多的文檔。這是一個選擇的問題。 – iefpw 2012-02-23 04:43:23