2013-11-09 56 views
1

我正在寫應用程序什麼將被操作超過100Gb文本文檔。每個文件的大小是2Kb-100Kb。Lucene能夠在索引中存儲100GB以上的原始文檔嗎?

起初我應該使用使用DBMS如MySQL或Firebird來存儲原始文檔並在lucene索引中存儲索引。這種方法有一些缺點。例如,數據庫事務對lucene索引一無所知,反之亦然。所以我需要同步它們。

然後,我假設什麼Lucene可以存儲索引的整個文件。所以我需要定期創建索引的備份。但很簡單:我可以用索引複製整個目錄。我使用某種無SQL存儲(即Lucene)。我可能不會使用DBMS。

什麼是最佳實踐:將原始文檔存儲在索引中還是不存在?我真的不想使用DBMS來達到這個目的。可能嗎?

+0

看看solr和彈性搜索,它們也是爲大型商店設計的,也許更容易管理和擴展。 Bart提到的是有效的,但不要將索引中的文檔存儲在可搜索的數據中。 – Dreamwalker

回答

3

您不想將原始文檔存儲在Lucene索引中,尤其是您正在討論的大小。我已經做了幾個方法,但都只是將索引字段存儲在Lucene索引中,並且您有一個指向原始文檔的ID /指針。我已經處理了超過1億條記錄的索引,並且它們可以在單個服務器上正常工作。

這很重要的原因是,如果您不需要額外存儲100個數據,索引的構建時間和索引的可管理性會大幅下降。

基本上,您需要索引搜索/滿足搜索查詢所需的所有字段。如果用戶點擊網格中的項目,我假設您想要顯示原始文本(UI模式是大多數時候您將訪問大量Lucene字段,但RARELY需要拉下完整的二進制文本文件)。

我已經結合Lucene的結合使用的原始訪問是:

  • SQL Server的FILESTREAM,這是爲大的二進制文件存儲進行優化。它也非常快。不知道MySQL是否有這個(從來沒有使用過)
  • Azure表存儲,這是一個關鍵值NoSQL雲數據庫。這被用來存儲二進制blob。

只要對可以基於密鑰進行快速訪問/流式傳輸的較大二進制文件進行優化,持久存儲的效果並不重要。只要Lucene具有訪問二進制文本文件的ID指針,就可以像Redis一樣使用內存緩存。

+0

非常感謝!上面你提到Redis是快速存儲和檢索整個文檔的解決方案。正如我所提到的,我有超過100GB的原始文檔和只有12Gb的RAM,因此只有小部分數據庫可以加載到RAM中。這種方法會起作用嗎?所有我需要的:保存文檔並通過鍵檢索它。原因是通過鍵刪除它。 我是否使用Redis作爲存儲文檔的快速,簡單和可靠(即耐久性)方法?如果沒有經典的DBMS,我寧願使用某種NoSQL。 – engineer

+0

Lucene可以與有限的RAM一起工作,我有多個索引,在具有14 gRAM的服務器上有數百萬條記錄。查詢可能會慢一點,但不會太多。由於您只有12臺RAM,Redis將無法完全爲您的解決方案工作。但是,我提到Redis的原因是它具有一個很好的功能,即只將密鑰存儲在RAM中以便快速查找。 Redis還可以通過添加多臺服務器並對其進行分片來擴大規模,從而有可能爲您提供100多個RAM,並在必要時將所有文檔存儲在內存中。您還應該測試一個簡單的方法,只需使用HD ... –

+0

並將您的文件命名爲密鑰或獨特組合鍵。例如,Lucene會檢索10個匹配的查詢。用戶單擊ID = 100。在Java/C#等代碼中,您可以找到在Lucene中單擊的ID,並簡單地轉到您的文檔目錄並檢索文件100.txt。我假設你將有這個文檔目錄,因爲你確實需要索引這些文件。如果你可以使你的文本名稱是唯一的,那麼也可以工作(沒有NoSQL數據庫的複雜性/開銷)。 –

相關問題