全文搜索通常也就是文本搜索,它可以提供满足查询的识别自然语言的能力,并且任意性地通过相关性查询进行排序。搜索最常见的类型就是找到所有包含给定的查询术语的记录,并且以相似性的查询顺序返回它们。
对于普通检索如~、~*、like和ilike操作的劣势:
1.对语言支持较弱,比如不能识别单词的复数形式,比如检索friend时不能检索出friends或者friendly。
2.没有有效的分类和排序手段,检索出的结果排序功能不好。
3.缺少索引支持,查询速度慢,特别是两头加了两个%时根本就不走索引。
PostgreSQL在8.3.x版本后开始支持全文检索。执行步骤,主要分三步走:
1.将文档分词(parsing documents into tokens)
2.转换分词规则(converting tokens into lexemes),如去掉复数后缀s/es,以及加入stop词,使之不会在分词中出现,如常用的'的'
3.按一定顺序查询的优化方式存储(storing preprocessed documents optimized for searching) tsvector存储,使用tsquery查询
在pgsql中,文档通常是一个数据库表中一行的文本字段,或者是这些字段的可能组合(级联),可能存储在多个表中或者动态的获得。也就是说,一个文档可以由索引的不同部分部分构成,它不一定非要作为一个整体存储。
中文检索的例子: http://my.oschina.net/Kenyon/blog/82305
其它:http://my.oschina.net/Kenyon/blog/80904
http://www.54chen.com/_linux_/postgresql-bamboo-lucene-part2.html