Postgresql:可以在 lob 内进行全文搜索吗?

Posted

技术标签:

【中文标题】Postgresql:可以在 lob 内进行全文搜索吗?【英文标题】:Postgresql: Full text search within lob possible? 【发布时间】:2012-10-18 14:19:27 【问题描述】:

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

对我们来说,可以搜索这些文档(.pdf.doc、...)非常重要。用built-in PostgreSQL full text search可以搜索表和列,但是是否也可以搜索pg_largeobject表中的大对象?

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

【问题讨论】:

您是否考虑过仅使用 Solr 而不是其他 RDBMS? Solr 支持索引 PDF 和 DOC 文件 + 分面搜索。据我所知,您可以将 Solr 用作 NoSQL 数据存储,也就是说,将实际的 PDF/DOC 文件直接存储在 Solr 中。不过我不知道 2 GB 文件。 您可以使用 Apache Tiki 库来获取 PDF 或 Word 文档的纯文本,并将它们放在另一个列中。哎呀,您可能可以使用 PL/Java 在数据库中直接完成 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

这里至少有两个问题。

    全文搜索实际上不适用于存储为 lob 或 oid-references 的大型对象。你不能对pg_largeobject的内容进行全文索引。

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

您可以:

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

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

李>

【讨论】:

以上是关于Postgresql:可以在 lob 内进行全文搜索吗?的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 中的高效全文搜索,在另一列上排序

使用PostgreSQL进行全文检索

PostgreSQL全文检索简介

PostgreSQL(全文搜索)与 ElasticSearch

ftserver 使用,全文搜索,可搜古文古诗词

PostgreSQL 全文搜索权重/搜索词的优先级