2016-06-21 9 views
0

が含まれています.IBM Informix、MySQL、およびOracleのいずれかで動作するアプリケーションがあります.HibernateでJavaを使用してデータベースに接続しています。 XML、CSVなどのテキストベースのファイルをデータベース(clob列)に保存します。 Javaのエンティティはbyte[]オブジェクトです。Informix、MySQL、およびOracle blobには、

アプリケーションへの1つの機能要求が、データ内のコンテンツを "grep"するようになりました。だから私は特定のコンテンツを持つすべてのファイルを見つける必要があります。

通常のchar/varcharフィールドでは、like '%xyz%'を使用できますが、これはバイト[]/blobでは機能しません。

最初の方法は、各エンティティをロードし、byte[]を文字列にキャストし、Javaでcontainsメソッドを使用することでした。使用で他の(非clob)列のフィルタパラメータが入力された場合、私はスキャンする必要のあるブロブの数を減らすためにclobをテストする前にこれらのフィルタを適用します。

これは、アプリケーションとデータベースが同じサーバー上にある限り、100個のファイル(clob)に対して非常にうまく機能しました。しかし、データベース内に1.000.000個のファイルがあり、データベースが常に同じネットワークにあるとは限りません。だから私はそれは良い考えではないと思う。

私の次の考えは、データベースプロシージャを作成することでした。しかし、これがInformix、MySQL、Oracleで可能かどうかはよく分かりません。これが可能かどうかはわかりません。

最後に、好ましくない方法は、データの内容をクローブ内に保存することです。たぶん私は別のデータ型を使うことができますか?

これを実現する方法は誰にも分かりますか?私は、3つのDBMSすべての解決策が必要です。アプリケーションは、接続されているDBMSの種類を知っています。だから私は3つの異なるソリューション(各DBMSに1つ)があれば大丈夫でしょう。

私が使用しているデータ型の種類(BLOB、CLOB ...)を変更することは完全に公開されています。

注:clobsは約5 KiBから約500 KiBの範囲で、最大1Mbです。

+0

各BLOB/CLOBオブジェクトのサイズはどれくらいですか? KiB、MiB、GiB、それ以上?オブジェクトが大きく、その数が多いほど、オブジェクトのそれぞれをクライアントコードに戻して、使用するかどうかを確認することが悪いほど、心配するのは正しいです。フィルタリングがサーバー側で行われていることを確認することが重要です。 –

+0

各エントリは約5kbから500kbまでです。 1ファイルあたり最大1MBです。そして、フィルタのパラメータが入力された場合は、前にフィルタリングして、スキャンするブロブの数を減らします。 – Hauke

+1

ほとんどのデータベースは、非構造化テキストデータのフリーフォームGoogle検索のような機能を備えています。バイナリデータではないので、 'blob'ではなく' clob'カラムにデータを格納したいと思うでしょう。次に、何らかのテキスト索引を作成します(Oracleでは、探している機能はOracle Textです)。しかし、各データベースの実装は非常にユニークなものになるでしょう。これは、ANSI標準のSQLで照会するものではありません。 –

答えて

0

Apache Luceneまたは他のテキストインデックスライブラリを調べます。 https://en.wikipedia.org/wiki/Lucene http://en.wikipedia.org/wiki/Full_text_search

あなたは、各データベース用のカスタムソリューションを実装する必要がありますOracle Textの検索のようなDB具体的な解決策で行く場合。経験から、Oracle Textの検索にはかなりの時間がかかり、正しい結果を得るためには多くの調整が必要であることがわかっています。

また、DBソリューションを使用する場合、データセットが同じであっても、各DBに異なる結果が表示されます(各DBには独自のインデックス作成方法とデータ取得方法があります)。

Luceneのようなサードパーティのソリューションでは、1つのソリューションしか学ばなくても、結果はDbに関係なく一貫しています。

関連する問題