以本站为例,文章都是放在articles这张表中,文章有标题和内容,即title和body,现在要对这两个做全文检索。

安装gem

查看pg_search的readme文档就可以知道。它主要有两种使用方式,分别是Multi-search和search scopes。Multi-search是适合于网站比较复杂,例如多张表,要把多张表揉在一起,放到一张表来做查找。现在我们的网站简单,不需要这个功能,所以我们来看看search scopes的用法。

  1. include PgSearch
  2. pg_search_scope :search_by_title_or_body, :against => [:title, :body]
  3. end

rails console创建一些文档,之后就能用Article.search_by_title_or_body来搜索了。

pg_search还有其他强大的功能。我们来介绍一下。

我们现在是在articles这张上做查询,那是因为我们的网站简单,但有时候是要跨表的,那也很简单。比如,article是has_many :tags的,就可以这样。

可以查看log看具体做了什么操作。其实就是joins之类。

这篇文章PostgreSQL的全文检索系统之中文支持(三)有介绍PostgreSQL中文支持。

  1. include PgSearch
  2. pg_search_scope :search_by_title_or_body,
  3. :against => [:title, :body],
  4. :tags => [:name],
  5. },
  6. :using => {
  7. :tsearch => {:dictionary => "testzhcfg"}
  8. }
  9. end

可以给需要搜索的项加上优先级,比如,标题要优先于内容。

可以看看日志,如果有类似于”setweight”的输出,说明成功了。

假如要搜索一个词,例如rails,但是忘了怎么拼写,只记得前两个单词,那就是ra,但输入ra时也能找到关于rails的文章,这就是前缀的作用。使用也很简单。

  1. class Article < ActiveRecord::Base
  2. pg_search_scope :search_by_title_or_body,
  3. :title => 'A',
  4. :body => 'B'
  5. },
  6. :associated_against => {
  7. :tags => [:name],
  8. },
  9. :using => {
  10. :tsearch => {:dictionary => "testzhcfg", :prefix => true}
  11. }

否定就是可以搜索不包含的内容,比如!ruby,就是不搜索ruby,其他的都搜索,一个相反过程啦。

完结。