2016-06-21 60 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如何,结果都是一致的。