Postgresql:是否可以在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的内容进行全

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

对我们来说,搜索这些文档(
.pdf
.doc
,…)非常重要。使用表和列可以进行搜索,但是也可以搜索
pg_largeobject
表中的大型对象吗


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

这里至少有两个问题

  • 全文搜索在存储为
    lob
    或oid引用的大型对象上实际上不起作用。不能对
    pg\u largeobject
    的内容进行全文索引

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

  • 您可以:

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

    • 使用功能更强大、功能更全面的外部搜索系统,如(基于),该系统设计用于处理各种格式,自行进行文本提取等


    在PostgreSQL中,全文搜索主要基于一个非常重要的函数
    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在数据库中正确地执行此操作