2011-11-16 36 views
5

我有一個Solr的索引與文檔字段類似:頻繁地更新Solr的文檔 - 效率/可擴展性涉及

id, body_text, date, num_upvotes, num_downvotes 

在我的應用程序,文檔與某個整數id創建和一些body_text(500個字符最多)。該日期設置爲輸入的時間,num_upvotesnum_downvotes從0開始。

我的應用程序使用戶能夠給予好評和downvote上述內容我想跟蹤此Solr中,而不是能力,而原因只是數據庫是我想能夠考慮upvotes和downvotes到我的search的數量。

這是一個問題,因爲你不能簡單地更新一個solr文檔(即遞增數量的up_votes),你必須替換整個文檔,這可能是相當低效的,因爲它需要打我的數據庫來抓取所有相關數據再次。

我意識到解決方案可能需要不同的數據佈局,或者可能需要多個索引(儘管我不知道您是否可以跨索爾核心查詢/評分)。

是否有人能夠提供有關如何解決這個問題的任何建議?

+0

我問過這樣的問題:http://stackoverflow.com/questions/8411860/can-solr-boost-results-on-number-of-social-likes – aitchnyu

回答

4

我在類似問題中使用的解決方案是更新數據庫中的信息,並使用自上次更新後修改的文檔每十分鐘執行一次SOLR更新/插入操作。

同樣每天晚上,當我沒有太多的流量時,我做索引優化。 每次導入後,我在SOLR配置中設置一些熱身查詢。

在我的SOLR索引中,我有大約1.5百萬個文檔,每個文檔有24個字段,整個文檔中大約有2000個字符。 我每隔10分鐘就會更新一次索引,大約500個文檔(不優化索引),並且我會進行大約50次熱身查詢,這些查詢包含最常見的方面,大多數使用的過濾器查詢和自由文本搜索。

我對性能沒有負面影響。 (至少它不可見) - 我的查詢平均在0.1秒內運行。 (在每10分鐘更新之前,平均查詢爲0。09秒)

以後編輯:

我沒有遇到在此更新的任何問題。我總是從數據庫中獲取文檔,並將其插入SOLR的唯一鍵。如果文檔存在於SOLR中,它會被替換(這就是我的意思是更新)。

它永遠不會超過3分鐘更新SOLR。其實我每次更新後都會做10分鐘的休息。所以我開始更新索引,等待它完成,然後再等10分鐘再開始。

我沒有看到整個晚上的表現,但對我而言,這並不相關,因爲我想在用戶訪問高峯期間獲得新的數據信息。

+0

感謝您的信息。我實際上已經考慮過這種間隔更新方法,您是否知道在這些10分鐘更新發生時是否存在衝突問題? (即,如果這些文檔在索引的「出」之後簡要地執行查詢「miss」他們?) - 也很好奇,當您運行它時,「索引優化」需要多長時間?你是否發現這種夜間運行能夠不平凡地提高性能? – csjohn

+0

看到我的更新:) – Dorin

+0

我一直在尋找這樣一個很長一段時間的答案 – aitchnyu

1

如果您只是要更新上/下選票。您可以不用回到數據庫,只需爲您的應用程序使用適當的Solr Client並從索引中提取文檔,根據需要設置上/下值,然後將文檔重新插入索引。

+0

問題是在solr我們可以設置字段'存儲=假',以防止腫脹,特別是在規模。所以,如果我不存儲body_text,我將無法從Solr中將其拉出並重新插入。 – csjohn

2

Join功能將幫助你在這裏。然後,您可以將上/下選票存儲在單獨的文檔中。

壞消息是,你需要等到Solr 4,除非你很舒服地運行一個主幹構建。

+0

感謝您的提示。任何想法Solr 4的樹幹有多穩定? (或任何想法,當Solr 4發佈會) – csjohn

+0

我幾天前想知道同樣的事情。從我記得的谷歌搜索中,有一些人在使用Solr 4製作。確定一個開源項目的發佈日期非常困難,但我記得有人猜測8個月後會有人猜測。您可以看到以下問題仍然存在:https://issues.apache.org/jira/browse/SOLR/fixforversion/12314992#atl_token=A5KQ-2QAV-T4JA-FDED%7C998a6b54a3f89920a488573221c1192d2e78926c%7Clout&selectedTab=com.atlassian.jira。 plugin.system.project%3Aversion-issues-panel – brian519

0

在SOLR中沒有解決您的問題的方法。你有一個數據庫問題,你正試圖用搜索引擎來解決它。

處理此問題的最佳方法是保留一個redis數據庫,記錄來自SOLR的document id以及向上/向下投票計數。然後,您的應用可以在顯示之前合併來自兩個來源的數據。