我使用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关系?
答案 0 :(得分:1)
我做了一个解决方法,在我的主表中添加了一个str_ *列,并在保存一个元素时更新了这个列,然后搜索该列:
before_validation(on: :create) do
self.str_abbreviations = join_abbreviations()
... etc ...
true
end