我们有一个可以与任何IBM Informix,MySQL和Oracle一起运行的应用程序,我们使用Java和Hibernate连接到数据库。我们将XML,CSV和其他基于文本的文件存储在数据库(clob列)中。 Java中的实体是byte[]
个对象。
现在,对应用程序的一个功能请求是" grep"数据内容。所以我需要查找具有特定内容的所有文件。
在常规char / varchar字段上,我可以使用like '%xyz%'
,但这不适用于byte [] / blobs。
第一种方法是加载每个实体,将byte[]
转换为字符串并使用Java中的contains
方法。如果使用在其他(非clob)列上输入任何过滤器参数,我将在测试clob之前应用这些过滤器,以减少我必须扫描的blob数量。
只要应用程序和数据库位于同一台服务器上,就可以很好地处理100个文件(clobs)。但我认为如果我在数据库中有1.000.000个文件并且数据库并不总是在同一个网络中,它会变得非常慢。所以我认为这不是一个好主意。
我的下一个想法是创建一个数据库程序。但我不太确定Informix,MySQL和Oracle是否可行。我不确定这是否可能。
最后但不受欢迎的方法是将数据的内容存储在clob中。也许我可以使用不同的数据类型?
有谁知道如何实现这一目标?我需要一个针对所有三个DBMS的解决方案。应用程序知道它连接到哪种DBMS。如果我有三种不同的解决方案(每个DBMS一个),那就没关系。
我完全愿意改变我使用的数据类型(BLOB,CLOB ...) - 我可以根据需要修改它。
注意:clob的范围从大约5 KiB到大约500 KiB,最大为1 MiB。
答案 0 :(得分:0)
查看Apache Lucene或其他文本索引库。 https://en.wikipedia.org/wiki/Lucene http://en.wikipedia.org/wiki/Full_text_search
如果您使用Oracle Text Search等特定于数据库的解决方案,则必须为每个数据库实施自定义解决方案。我从经验中知道,Oracle Text搜索需要花费大量时间来学习,并且需要进行大量调整才能做到正确。
此外,如果使用数据库解决方案,即使数据集相同,每个数据库也会收到不同的结果(每个数据库都有自己的索引和检索数据的方法)。
通过使用像Lucene这样的第三方解决方案 - 你只需要学习一个解决方案,无论Db如何,结果都是一致的。