2016-06-21 59 views
0

我們有一個可與IBM Informix,MySQL和Oracle運行的應用程序,並且我們使用Java和Hibernate連接到數據庫。我們將XML,CSV和其他基於文本的文件存儲在數據庫(clob列)中。 Java中的實體是byte[]對象。Informix,MySQL和Oracle blob包含

對應用程序的一個功能請求現在是「grep」數據內的內容。所以我需要找到具有特定內容的所有文件。

在常規的char/varchar字段上,我可以使用like '%xyz%',但這不適用於byte []/blob。

第一種方法是加載每個實體,將byte[]轉換爲字符串並在Java中使用contains方法。如果用戶在其他(非clob)列上輸入任何過濾器參數,我將在測試clob之前應用這些過濾器,以減少我必須掃描的斑點數量。

對於100個文件(clobs)以及只要應用程序和數據庫位於同一臺服務器上,這種方式效果很好。但是,如果我在數據庫中有1.000.000個文件並且數據庫不總是在同一個網絡中,我認爲它會變得非常慢。所以我認爲這不是一個好主意。

我的下一個想法是創建一個數據庫過程。但我不確定這對Informix,MySQL和Oracle是否可行。我不確定這是否可能。

最後一個但並不喜歡的方法是將數據內容存儲在clob中。也許我可以使用不同的數據類型呢?

有沒有人有一個好主意如何認識到這一點?我需要爲所有三個DBMS提供解決方案。應用程序知道它連接到什麼類型的DBMS。所以如果我有三種不同的解決方案(每個DBMS一個),那就沒問題了。

我完全開放以改變我使用的數據類型(BLOB,CLOB ...) - 我可以根據需要修改它。

注意:clobs範圍從大約5 KiB到大約500 KiB,最大1 MiB。

+0

每個BLOB/CLOB對象有多大? KiB,MiB,GiB,更大?對象越多,它們越多,將每個對象返回給客戶端代碼以查看是否應該使用對象就越糟糕 - 所以您有權擔心。確保過濾完成服務器端將是至關重要的。 –

+0

每個條目將大約5kb到500kb。每個文件最多1MB。如果使用過程中輸入任何過濾器參數,我將過濾以減少我必須掃描的斑點數 – Hauke

+1

大多數數據庫都具有某種功能,用於對非結構化文本數據進行自由格式Google搜索。由於數據不是二進制數據,你幾乎肯定希望將數據存儲在clob列而不是blob中。然後,您將構建某種文本索引(在Oracle中,您正在尋找的功能是Oracle Text)。但是每個數據庫的實現將會是相當獨特的,這不是你要用ANSI標準SQL查詢的東西。 –

回答

0

查看Apache Lucene或其他文本索引庫。 https://en.wikipedia.org/wiki/Lucene http://en.wikipedia.org/wiki/Full_text_search

如果你和如Oracle文本搜索一個DB具體的解決方案去,你將必須實現對每個數據庫定製的解決方案。我從經驗中知道,Oracle Text搜索需要花費大量時間進行學習,並且需要進行大量調整才能獲得正確的結果。如果使用DB解決方案,即使數據集相同(每個數據庫都有它自己的索引和檢索數據的方法),每個數據庫中也會得到不同的結果。

通過像Lucene這樣的第三方解決方案 - 你只需要學習一個解決方案,無論Db如何,結果都是一致的。