9

我们想使用 PostgreSQL 来存储文档。由于其中一些可能高达 2 GB,我们必须使用 lob 数据类型,其中大对象存储在一个单独的表 ( pg_largeobject) 中,由 OID 引用,根据大对象的文档

对我们来说,可以搜索这些文档 ( .pdf, , ...) 非常重要。.docPostgreSQL自带的全文搜索可以搜索表和列,但是是否也可以搜索pg_largeobject表中的大对象呢?

如果没有,我们必须使用 Oracle。

4

2 回答 2

3

这里至少有两个问题。

  1. 全文搜索并不真正适用于存储为lob或 oid 引用的大型对象。您不能对 的内容进行全文索引pg_largeobject

  2. 全文搜索是文本的索引系统。它不能索引 PDF、Microsoft Word 文档或其他随机二进制文件。它没有提供文本提取工具回调等。

您可以:

  • 创建一个表格,其中包含使用外部工具从这些文件中提取的文本以及oid引用文件自身的表格,然后对提取的文本表格进行全文索引;或者

  • 使用更强大、功能更全面的外部搜索系统,如Solr(基于Lucene),旨在应对各种格式、进行自己的文本提取等。

于 2012-10-29T09:24:40.670 回答
2

在 PostgreSQL 中,全文搜索主要基于一项非常重要的功能to_tsvector()。此函数将文本文档转换为tsvector数据类型。通常,tsvector物理大小约为原始文本的 1%。

tsvector所有其他文本搜索方法都基于在计算值或物理值之上创建索引。考虑到这一点,您可以在任何地方(甚至在客户端!)计算必要tsvector的值并将其保存在专门创建的列中以用于索引目的。换句话说,您实际上不必将原始文本存储在数据库中 -tsvector您只需要告诉哪个文档包含您正在搜索的文本(但它不会告诉您在单个文档中的位置)。很酷的是,索引文档可以是任何东西——甚至是 Word、Excel、PDF 等等,只要您可以获得该文档的文本内容并计算tsvector存储和索引所需的内容。

重新计算的一个小缺点tsvector(尤其是在客户端)是每次更改原始文档时都必须重新计算它。

于 2012-10-29T10:14:02.437 回答