我们想使用 PostgreSQL 来存储文档。由于其中一些可能高达 2 GB,我们必须使用 lob 数据类型,其中大对象存储在一个单独的表 ( pg_largeobject
) 中,由 OID 引用,根据大对象的文档。
对我们来说,可以搜索这些文档 ( .pdf
, , ...) 非常重要。.doc
PostgreSQL自带的全文搜索可以搜索表和列,但是是否也可以搜索pg_largeobject
表中的大对象呢?
如果没有,我们必须使用 Oracle。
在 PostgreSQL 中,全文搜索主要基于一项非常重要的功能to_tsvector()
。此函数将文本文档转换为tsvector
数据类型。通常,tsvector
物理大小约为原始文本的 1%。
tsvector
所有其他文本搜索方法都基于在计算值或物理值之上创建索引。考虑到这一点,您可以在任何地方(甚至在客户端!)计算必要tsvector
的值并将其保存在专门创建的列中以用于索引目的。换句话说,您实际上不必将原始文本存储在数据库中 -tsvector
您只需要告诉哪个文档包含您正在搜索的文本(但它不会告诉您在单个文档中的位置)。很酷的是,索引文档可以是任何东西——甚至是 Word、Excel、PDF 等等,只要您可以获得该文档的文本内容并计算tsvector
存储和索引所需的内容。
重新计算的一个小缺点tsvector
(尤其是在客户端)是每次更改原始文档时都必须重新计算它。