2011-04-25 41 views
4

我正在評估Lucene在SaaS應用程序中實現全局搜索功能。Lucene索引:共享或帳戶隔離?

我們不希望用戶看到其他帳戶的內容,因此搜索將始終受到帳戶的限制。

使用帳戶ID字段或每個帳戶一個索引有單一索引是更好嗎?每種方法的優點和缺點是什麼?

我擔心全局索引可能會因頻繁更新而影響性能。

謝謝。

編輯

  • 估計數量總文件:500,0000
  • 帳戶數量:4000
  • 可轉位數據永遠不會之間共享佔
  • 帳戶用戶可以更新他們的可轉位數據每天數次(大多數情況下不超過100次)
  • 索引數據量在初始設置後趨於穩定過程
  • 我們需要保存每個文檔
+0

您的問題太寬泛/複雜;答案很大程度上取決於您的應用程序及其架構的其他方面。什麼是查詢索引的運行環境?可索引數據經常在許多帳戶之間共享?數據是否經常更新?多久?一個典型賬戶的索引數據的增長率是多少?等等等等。 – 2011-04-25 22:09:36

回答

2

這裏有一些事情我曾經想,除了常見的問題(如索引更新和等):

  1. Lucene的回報率排名的方式結果取決於一些「語料庫寬」的統計數據,例如該字段出現的文檔總數。因此,如果客戶a的指數統計不適合客戶b,那麼它將損害兩個客戶的相關性,除了存在安全風險外......如果奧斯卡足夠聰明,他真的可以開始顛倒鮑勃的文件,因爲倒排索引:http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.159.9682你可以用這個排名算法解決這個問題:https://issues.apache.org/jira/browse/LUCENE-2864
  2. lucene中的其他一些東西適用於「整個領域」或「索引作爲一個整體」,你應該知道他們可以'如果您將索引組合在一起,那麼實際上可以根據每個客戶進行更改:omitTF(如果您將其設置爲單個文檔中的某個字段,則將其忽略),相似性(任何已發佈的lucene ,你只能在整個板子上設置相似度,所以客戶將無法調整排名模型),拼寫檢查(你必須破解一些東西每個客戶都有自己的「過濾」拼寫檢查索引),...
  3. 另一方面,如果您有很多條款,需要相當多的內存,通過給每個客戶自己的索引,對於所有的索引,需要更多的內存來保存RAM中的術語索引。但是,您可以通過調整termIndexInterval/Divisor等來降低這一點。
+0

關於1中提到的論文,是否可以說使用自定義搜索過濾器來實現他們的第二種方法(查詢集成)是正確的? – 2011-04-26 01:59:05

+0

除非您對IDF做些什麼......對於lucene來說,最簡單的解決方案是使用過濾器+相似性,根本不使用任何全局統計信息。 – 2011-04-26 02:20:15

1

我已經在這裏和那裏做了一些「安全修剪」索引 - 如果允許的話,絕對有可能。也就是說,對於有多個客戶端的SAAS類型的東西,我的一般傾向是儘可能多地分離客戶端,原因如下:

a)確保編碼錯誤不會導致數據泄露,憤怒的客戶端,訴訟和其他胡哈哈。
b)使每個客戶端的定製變得更容易 - 你的整個代碼庫不需要處理客戶特定的fubar請求
c)從第一天開始就強制你進入水平可伸縮的架構 - 如果添加實例很容易,對?

哦,絕對採取Will Hartung的建議 - 立面搜索,那些東西真的不應該爬出它的層。