我在用卡米纳里宝石为我的搜索分页:

@outfits = Outfit.where("description LIKE ?", "%warm%").page(params[:page]).per(20)

并使用此代码决定是否显示更多:
<% unless @outfits.current_page == @outfits.total_pages %>
 <p id="view-more">
  <%= link_to('View More', url_for(page: @outfits.current_page + 1), remote: true) %>
 </p>
<% end %>

问题是,就加载时间而言,比较当前页是否是最后一页比较昂贵。我的数据库中有数百万套设备,因此activerecord计数时间平均超过600毫秒:
   (616.9ms)  SELECT COUNT(*) FROM "outfits" WHERE (desc LIKE '%warm%')

我该怎么做才能加快速度呢?

最佳答案

简短的回答不是真的。如果要基于用户输入运行LIKE查询,则必须以任何一种方式对其进行计数,以判断用户是否在最后一页。
您可以利用文本搜索引擎(如elasticsearch-rails)显著加快搜索速度。https://github.com/elastic/elasticsearch-rails设置它会有一些开销,但是如果你有数百万的记录,可能是值得去弄清楚的。
如果您能够启动并运行它,就可以从索引中获得结果计数,这应该比使用LIKE查询访问postgres快得多。

08-17 13:10