0

我使用PostgreSQL 的全文搜索功能,效果很好。所有相关列都已编入索引,因此既好又快:

  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 关系?

4

1 回答 1

1

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

  before_validation(on: :create) do
    self.str_abbreviations = join_abbreviations()
    ... etc ...
    true
  end
于 2013-08-06T20:29:33.333 回答