GBase 8c 函数与操作符——33-全文检索

本文介绍了GBase8c数据库的全文检索功能,包括文本搜索的局限性、全文索引的预处理步骤、文档概念、基本文本匹配方法及配置选项。通过使用tsvector和tsquery数据类型以及匹配操作符@@,可以实现高效且灵活的全文搜索。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、概述

文本搜索(*、LIKE和ILIKE操作符)在对文本进行搜索操作时,缺少一些系统要求的必要属性:

  • 及时是英文环境也没有语义支持;
    由于要识别派生词并不是那么容易,因此正则表达式也不能满足要求。如,satisfies和satisfy,当使用正则表达式寻找satisfy时,并不会查询到包含satisfies的文档。用户可以使用OR搜索多种派生形式,但过程非常繁琐。并且有些词会有上千的派生词,因此容易出错。
  • 没有对搜索结果的分类(排序)。当搜索出成千的文档时,查找效率很低。
  • 由于没有索引的支持,每一次的搜索需要遍历所有的文档,整体搜索比较缓慢。

使用全文索引可以对文档进行预处理,并且可以使后续的搜索更快速。预处理过程包括:

  • 将文档解析成记号:
    为每个文档标记不同类别的记号是非常有必要的,例如:数字、文字、复合词、电子邮件地址,这样就可以做不同的处理。原则记号的类别依赖于具体的应用,但对于大多数的应用来说,可以使用一组预定义的记号类。
  • 将记号转换为词位:
    词位像记号一样是一个字符串,但它已经标准化处理,这样同一个词的不同形式是一样的。例如,标准化通常包括:将大写字母折成小写字母、删除后缀(如英语中的s或者es)。这将允许通过搜索找到同一个词的不同形式,不需要繁琐地输入所有可能的变形样式。同时,这一步通常会删除停用词。这些停用词通常因为太常见而对搜索无用。(总之,记号是文档文本的原片段,而词位被认为是有用的索引和搜索词。)GBase 8c使用词典执行这一步,且提供了各种标准的词典。
  • 保存搜索优化后的预处理文档。
    比如,每个文档可以呈现为标准化词位的有序组合。伴随词位,通常还需要存储词位位置信息以用于邻近排序。因此文档包含的查询词越密集其排序越高。

词典能够对词位如何标准化做到细粒度控制。使用合适的词典,可以定义不被索引的停用词。

数据类型tsvector用于存储预处理文档,tsquery用于存储查询条件,详细请参见文本搜索类型。为这些数据类型提供的函数和操作符请参见文本检索函数和操作符。其中最重要的是匹配运算符@@,将在基本文本匹配中介绍。

2、文档概念

文档是全文搜索系统的搜索单元,例如:杂志上的一篇文章或电子邮件消息。文本搜索引擎必须能够解析文档,而且可以存储父文档的关联词素(关键词)。后续,这些关联词位用来搜索包含查询词的文档。

文档通常是一个数据库表中一行的文本字段,或者这些字段的可能组合(级联)。文档可能存储在多个表中或者需动态获取。换句话说,一个文档由被索引化的不同部分构成,因此无法存储为一个整体。比如:

gbase=# SELECT name || ' ' ||  age || ' ' ||  address || ' ' || salary AS document FROM company WHERE id = 2;
       document
----------------------
 Allen 25 Texas 15000
(1 row)

注意:实际上,在这些示例查询中,应该使用coalesce防止一个独立的NULL属性导致整个文档的NULL结果。

另外一种可能是:文档在文件系统中作为简单的文本文件存储。在这种情况下,数据库可以用于存储全文索引并且执行搜索,同时可以使用一些唯一标识从文件系统中检索文档。然而,从数据库外部检索文件需要拥有系统管理员权限或者特殊函数支持。因此,还是将所有数据保存在数据库中比较方便。同时,将所有数据保存在数据库中可以方便地访问文档元数据以便于索引和显示。

为了实现文本搜索目的,必须将每个文档减少至预处理后的tsvector格式。搜索和相关性排序都是在tsvector形式的文档上执行的。原始文档只有在被选中要呈现给用户时才会被当检索。因此,我们常将tsvector说成文档,但是很显然其实它只是完整文档的一种紧凑表示。

3、基本文本匹配

GBase 8c的全文搜索基于匹配操作符@@,它在一个tsvector(文档)匹配一个tsquery(查询)时返回true。例如:

gbase=# SELECT 'a fat cat sat on a mat and ate a fat rat'::tsvector @@ 'cat & rat'::tsquery;
 ?column?
----------
 t
(1 row)

gbase=# SELECT 'fat & cow'::tsquery @@ 'a fat cat sat on a mat and ate a fat rat'::tsvector;
 ?column?
----------
 f
(1 row)

tsquery可以包含搜索术语,并且可以使用 AND 、OR、NOT 以及 FOLLOWED BY 操作符结合多个术语。函数to_tsquery、plainto_tsquery以及phraseto_tsquery可用于将用户书写的文本转换为正确的tsquery。文本搜索匹配:

gbase=# SELECT to_tsvector('fat cats ate fat rats') @@ to_tsquery('fat & rat');
 ?column?
----------
 f
(1 row)

@@操作符也支持text输出,它允许在简单情况下跳过从文本字符串到tsvector或tsquery的显式转换。可用形式有:

tsvector @@ tsquery
tsquery  @@ tsvector
text @@ tsquery
text @@ text

形式text @@ tsquery等价于to_tsvector(x) @@ y。形式text @@ text等价于to_tsvector(x) @@ plainto_tsquery(y)。

在<->(FOLLOWED BY) tsquery操作符的帮助下搜索可能的短语,只有该操作符的参数的匹配是相邻的并且符合给定顺序时,该操作符才算是匹配。例如:

gbase=# SELECT to_tsvector('fatal error') @@ to_tsquery('fatal <-> error');
 ?column?
----------
 t
(1 row)

gbase=# SELECT to_tsvector('error is not fatal') @@ to_tsquery('fatal <-> error');
 ?column?
----------
 f
(1 row)

FOLLOWED BY 操作符还有一种更一般的版本,形式是,其中N是一个表示匹配词位位置之间的差。<1>和<->相同,而<2>允许刚好一个其他词位出现在匹配之间,以此类推。当有些词是停用词时,phraseto_tsquery函数利用这个操作符来构造一个能够匹配多词短语的tsquery。例如:

gbase=# SELECT phraseto_tsquery('cats ate rats');
      phraseto_tsquery
-----------------------------
 'cats' <-> 'ate' <-> 'rats'
(1 row)

gbase=# SELECT phraseto_tsquery('the cats ate the rats');
                phraseto_tsquery
-------------------------------------------------
 'the' <-> 'cats' <-> 'ate' <-> 'the' <-> 'rats'
(1 row)

<0>可以被用来要求两个匹配同一个词的模式。
圆括号可以被用来控制tsquery操作符的嵌套。如果没有圆括号,|的计算优先级最低,然后从低到高依次是&、<->、!。

4、配置

全文检索功能还可以做更多事情:忽略索引某个词(停用词),处理同义词和使用复杂解析,例如:不仅基于空格的解析。这些功能通过文本搜索分词器控制。GBase 8c支持多语言的预定义的分词器,并且可以创建分词器(gsql的\dF命令显示了所有可用分词器)。

在安装期间选择一个合适的分词器,并且在postgresql.conf中相应的设置default_text_search_config。如果为了整个集群使用同一个文本搜索分词器可以使用postgresql.conf中的值。如果需要在集群中使用不同分词器,可以使用ALTER DATABASE … SET在任一数据库进行配置。用户也可以在每个会话中设置default_text_search_config。

每个依赖于分词器的文本搜索函数有一个可选的配置参数,用以明确声明所使用的分词器。仅当忽略这个参数的时候,才使用default_text_search_config。

为了更方便的建立自定义文本搜索分词器,可以通过简单的数据库对象建立分词器。GBase 8c文本搜索功能提供了四种类型与分词器相关的数据库对象:

  • 文本搜索解析器将文档分解为词位,并且分类每个词位(例如:词和数字)。
  • 文本搜索词典将词位转换成规范格式并且丢弃停用词。
  • 文本搜索模板提供潜在的词典功能:一个词典指定一个模板,并且为模板设置参数。
  • 文本搜索分词器选择一个解析器,并且使用一系列词典规范化语法分析器产生的词位。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值