我在用卡米纳里宝石为我的搜索分页:
@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快得多。