# 2. 全文检索系统之进阶 #### 1. 前言 这一篇文章简要介绍了[PostgreSQL的全文检索系统之基本介绍(一)](http://www.rails365.net/articles/2015-09-29-postgresql-de-quan-wen-jian-suo-xi-tong-zhi-ji-ben-jie-shao-yi),这一节来介绍一些额外的功能,比如排名,比如高亮等。 #### 2. 解析文档(Parsing Documents) 要查看一段文本是怎么被PostgreSQL分词的,可以用to\_tsvector这个指令,是这样使用的。 ``` postgres=# SELECT to_tsvector('english', 'a fat cat sat on a mat - it ate a fat rats'); to_tsvector ----------------------------------------------------- 'ate':9 'cat':3 'fat':2,11 'mat':7 'rat':12 'sat':4 (1 row) ``` #### 3. 搜索结果排名(Ranking Search Results) 就是使用ts\_rank或ts\_rank\_cd按照匹配词的出现次数做个排名。 例如: ``` rails365_pro=# select title, ts_rank(to_tsvector('english', body), to_tsquery('english', 'ruby')) AS rank from articles where to_tsvector('english', body) @@ to_tsquery('english', 'ruby') order by rank desc; title | rank -----------------------------------------------------+----------- 使用mina来部署ruby on rails应用 | 0.0928561 登录认证系统的进阶使用 | 0.0906656 devise简单入门教程 | 0.0889769 用exception_notification结合Slack或数据库来捕获异常 | 0.0889769 Mina的进阶使用 | 0.0865452 使用backup来备份数据库 | 0.0827456 用logrotate切割Ruby on rails日志 | 0.0759909 用OneAPM作为你的监控平台 | 0.0759909 ruby | 0.0607927 (9 rows) ``` #### 4. 结果的高亮(Highlighting Results) 有时候你需要把搜索的关键词高亮起来,就像谷歌,百度那样,PostgreSQL默认就支持的。 **PostgreSQL**有一个指令**ts\_headline**就是来做这个事情的。 **ts\_headline**使用起来也简单,看下面的例子: ``` rails365_pro=# select title,ts_headline('testzhcfg', title, to_tsquery('testzhcfg', 'mina')), ts_rank(to_tsvector('testzhcfg', title), to_tsquery('testzhcfg', 'mina')) AS rank from articles where to_tsvector('testzhcfg', body) @@ to_tsquery('testzhcfg', 'mina') order by rank; title | ts_headline | rank ---------------------------------+--------------------------------------+----------- 使用mina来部署ruby on rails应用 | 使用<b>mina</b>来部署rubyonrails应用 | 0.0607927 Mina的进阶使用 | <b>Mina</b>的进阶使用 | 0.0607927 (2 rows) ``` 高亮的地方就用`<b></b>`包住了。 具体的内容可阅读官方文档[textsearch-controls](http://www.postgresql.org/docs/9.4/static/textsearch-controls.html) 完结。 下一篇[PostgreSQL 的全文检索系统之中文支持 (三)](https://www.rails365.net/articles/postgresql-de-quan-wen-jian-suo-xi-tong-zhi-zhong-wen-zhi-chi-san)