Postgresql:可能在全文内搜索?

时间:2012-10-29 09:18:44

标签: postgresql search full-text-search

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

对我们来说,搜索这些文档(.pdf.doc,...)非常重要。可以搜索docs on large objects表和列,但是也可以搜索pg_largeobject表中的大对象吗?

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

2 个答案:

答案 0 :(得分:3)

这里至少有两个问题。

  1. 全文搜索不能真正用于存储为lob或oid-references的大对象。您无法对pg_largeobject

  2. 的内容进行全文索引
  3. 全文搜索是<​​em>文本的索引系统。它无法索引PDF,Microsoft Word文档或其他随机二进制文件。它没有提供文本提取工具回调等功能。

  4. 你可以:

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

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

答案 1 :(得分:1)

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

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

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