PostgreSQL全文检索
在日常的数据处理中,我们经常会有这样的需求:从一个文本中寻找某个字符串(比如某个单词)。
对这个需求,我们可以用类似这样的SQL完成:
SELECT * FROM student WHERE text LIKE ‘%pgsql%’;
(找到含有“pgsql”的文本)。
现在我们考虑一些特殊的情形:
- 需要查找的文本特别多,特别大;
- 不做单纯的字符串匹配,而是考虑自然语言的一些特性,比如匹配某一类字符串(域名、人名)或者匹配单词的所有形式
- 对中文的支持。
那么此时再用以上的 “SELECT … LIKE …” 就不明智了,因为对数据库来说,这样的SQL必然走的是全表扫描,那么当文本特别多、特别大的时候,查找效率就会很低。另外,这样的SQL也不会智能到可以处理自然语言的特性。
针对这一需要PostgreSQL提供了强大的全文搜索功能可以满足这样的需求。
PostgreSQL在8.3.x版本后开始支持全文检索。执行步骤,主要分三步走:
- 将文档分词 token,这些token可以是数字、单词、域名、人名、email的格式等等。在PG中可以定义一个parser(分析器)来做这个工作
- 转换分词规则如去掉复数后缀s/es,以及加入stop词,使之不会在分词 中出现
- 按一定顺序查询的优化方式存储 tsvector存储,使用tsquery查询
上述的这些操作都是对文本的预处理
tsvector
一个tsvector的值是唯一分词的分类列表,把一话一句词格式化为不同的词条,在进行分词处理的时候,tsvector会自动去掉分词中重复的词条,按照一定的顺序装入。例如:
SELECT