全文搜索通常也就是文本搜索,它可以提供满足查询的识别自然语言的能力,并且任意性地通过相关性查询进行排序。搜索最常见的类型就是找到所有包含给定的查询术语的记录,并且以相似性的查询顺序返回它们。
对于~、~*、like和ilike操作符来说,它们缺少很多特性:①对语言支持较弱,比如不能识别单词的复数形式。②没有有效的分类和排序手段 。 ③执行速度缓慢,通常就是因为无法有效的使用索引。
全文索引允许文档被预处理,并且它可以为后边的快速搜索保存一个索引。预处理做的工作主要有:①解析文档标记。比如它可以标识不同类别的记号,它可以区分数字、复合词、电子邮件地址等等,它们使用不同的处理方式。我们的pgsql使用解析器来执行这一步。②转换标记为词。词是一个字符串,就像一个标记一样,但是它被标准化过,这样同一个词的不同形式都是一样的。比如它们一般会删除后缀。我们的pgsql使用词典执行这一步。它可以提供各种标准词典,以及为特定的需求创造的自定义词典。③为优化搜索存储预处理文档。通常每个文档都可以表示为标准化词汇排序数组。
对于字典,它可以允许细粒度控制如何使用合适的字典规范化标记。我们可以:①定义不被索引的屏蔽词。②映射同义词到一个词。③使用同义词词典将短语映射到一个词。④根据词典将词的不同形式映射到一种范式。⑤根据词根将一个词的不同形式映射成为一种范式。
通常一个文档就是全文搜索系统的搜索单元,它可以是一篇文章或者是一封邮件。文本搜索引擎必须能够解析这个文档,而且可以存储它们同关键词的联系性,而这些联系用来搜索包含查询词的文档。
在pgsql中,文档通常是一个数据库表中一行的文本字段,或者是这些字段的可能组合(级联),可能存储在多个表中或者动态的获得。也就是说,一个文档可以由索引的不同部分部分构成,它不一定非要作为一个整体存储。