Postgresql:是否可以在lob中进行全文搜索?
我们希望使用PostgreSQL来存储文档。由于其中一些对象可能高达2GB,因此我们必须使用lob数据类型,其中大型对象存储在单独的表(Postgresql:是否可以在lob中进行全文搜索?,postgresql,search,full-text-search,Postgresql,Search,Full Text Search,我们希望使用PostgreSQL来存储文档。由于其中一些对象可能高达2GB,因此我们必须使用lob数据类型,其中大型对象存储在单独的表(pg_largeobject)中,由OID引用,如 对我们来说,搜索这些文档(.pdf,.doc,…)非常重要。使用表和列可以进行搜索,但是也可以搜索pg_largeobject表中的大型对象吗 如果没有,我们必须使用Oracle。这里至少有两个问题 全文搜索在存储为lob或oid引用的大型对象上实际上不起作用。不能对pg\u largeobject的内容进行全
pg_largeobject
)中,由OID引用,如
对我们来说,搜索这些文档(.pdf
,.doc
,…)非常重要。使用表和列可以进行搜索,但是也可以搜索pg_largeobject
表中的大型对象吗
如果没有,我们必须使用Oracle。这里至少有两个问题
lob
或oid引用的大型对象上实际上不起作用。不能对pg\u largeobject
的内容进行全文索引- 创建一个表,其中包含使用外部工具从这些文件中提取的文本,以及引用文件本身的
,然后对该提取文本表进行全文索引;或oid
- 使用功能更强大、功能更全面的外部搜索系统,如(基于),该系统设计用于处理各种格式,自行进行文本提取等
to_tsvector()
。
此函数用于将文本文档转换为tsvector
数据类型。通常,tsvector
物理大小约为原始文本的1%
所有进一步的文本搜索方法都基于在计算值或物理值上创建索引。考虑到这一点,您可以在任何地方(甚至在客户端!)计算必要的tsvector
值,并将其保存在专门创建的列中,以便编制索引。换句话说,您实际上不必将原始文本存储在数据库中-tsvector
是您所需要的全部,它可以告诉您正在搜索的文档中包含文本(但它不会告诉您在单个文档中的位置)。
很酷的一点是,索引文档可以是任何东西——甚至是Word、Excel、PDF等等,只要您能够获取文档的文本内容,并计算必要的tsvector
来存储和索引
重新计算
tsvector
(尤其是在客户端)的一个小缺点是每次更改原始文档时都必须重新计算它。您是否考虑过只使用Solr而不是另一个RDBMS?Solr支持索引PDF和文档文件+分面搜索。您可以将Solr用作NoSQL数据存储,也就是说,据我所知,将实际的PDF/DOC文件直接存储在Solr中。但是我不知道2GB的文件。你可以使用ApacheTiki库获取PDF或Word文档的纯文本,并将它们放在列中。见鬼,您可能可以使用PL/Java在数据库中正确地执行此操作