在Postgres和Rails中搜索多个表

时间:2013-08-05 17:36:54

标签: ruby-on-rails-3 postgresql full-text-search

我使用PostgreSQL's full text search功能,效果很好。所有相关的列都被编入索引,因此它很好而且快速:

  def self.text_search(query)
    if (query.present?)
      # search(query)
      where(
          "to_tsvector('english', title) @@ plainto_tsquery(:q)",
          q: query
      )
    else
      scoped
    end
  end

但现在我也想搜索相关的缩写:

def self.text_search(query)
    if (query.present?)
      # search(query)
      includes(:abbreviations).where(
          "to_tsvector('english', articles.title) @@ plainto_tsquery(:q)"+
          " or to_tsvector('english', abbreviations.abbreviation) @@ plainto_tsquery(:q)",
          q: query
      )
    else
      scoped
    end
  end

这有效,但现在我的查询需要2.5秒以上!我该如何解决这个问题?我当时认为这可能是Rails的低效率,所以我最好能够执行原始SQL。但是我该怎么做却仍然可以恢复ActiveRecord关系?

1 个答案:

答案 0 :(得分:1)

我做了一个解决方法,在我的主表中添加了一个str_ *列,并在保存一个元素时更新了这个列,然后搜索该列:

  before_validation(on: :create) do
    self.str_abbreviations = join_abbreviations()
    ... etc ...
    true
  end