以下查询的工作方式类似于魅力:
@styles = Style.search { fulltext params[:q] }
我遇到的问题是分页。以下是与分页相同的查询:
@styles = Style.search { fulltext params[:q]; paginate :page => params[:page], :per_page => params[:page_limit] }
我有11条Style
条记录。
如果我在搜索第11条记录时遇到:page => 1
和:per_page => 10
,我会为@styles.results
如果我设置:page=>2
并进行相同的搜索,我会得到第11个样式记录。
[11] pry(#<StylesController>)> params[:page]=2
=> 2
[12] pry(#<StylesController>)> x=Style.search {fulltext params[:q]; paginate :page => params[:page], :per_page => params[:page_limit] }
=> <Sunspot::Search:{:fq=>["type:Style"], :q=>"hel", :fl=>"* score", :qf=>"name_textp full_name_textp", :defType=>"dismax", :start=>10, :rows=>10}>
[13] pry(#<StylesController>)> x.results
=> [#<Style id: 15...>]
我认为重点是对搜索结果进行分页,而不是整个实际记录
这里发生了什么,我该如何解决?
修改
好的,让我试着用另一种方式解释。假设我有这六个记录:
1 => 'a'
2 => 'b'
3 => 'c'
4 => 'd'
5 => 'e'
6 => 'f'
假设我试图搜索“f”
Letter.search { fulltext 'f'; paginate :page => 1, :per_page => 5 }
我的结果将是一个空数组[]
现在让我说我试试
Letter.search { fulltext 'f'; paginate :page => 1, :per_page => 6 }
现在我的结果是[6 =&gt; 'F']
答案 0 :(得分:9)
我的想法:
从solr获取结果然后按solr搜索你的模型,solr返回并对它们进行分页,如下所示:
@search = Sunspot.search(Snippet) do
fulltext params[:search]
end
@styles = Style.where(id: @search.results.map(&:id)).page(params[:page]).per(5)
我从文档中理解的内容: 我没有尝试过
默认情况下,Sunspot请求Solr的前30个结果。这意味着您可以拥有100条可能与搜索条件相匹配的记录,但您只能看到前30条记录,要查看其他记录,您必须将分页添加到solr搜索中,例如:
search = Style.search do
fulltext "my cool style"
paginate :page => 2
end
在这种情况下,您应该能够访问2页。要更新您需要编写的太阳黑子请求数:
search = Style.search do
fulltext "my cool style"
paginate :page => 1, :per_page => 50
end
它应该在一个页面中提供50个结果,或paginate :page => 2, :per_page => 50
,结果应分为2页,每个结果最多50个。
答案 1 :(得分:2)
尝试向per_page
提供回退,如下所示:
@search = Style.search do
fulltext params[:q]
paginate(page: params[:page], per_page: (params[:per] || 15))
end
答案 2 :(得分:1)
我也遇到了同样的问题。所以我在搜索中删除了:per_page标记
并将我的查询更改为
@styles = Style.search { fulltext params[:q]; paginate :page => params[:page]}
要设置per_page_limit,我在初始化程序中使用了以下代码
Sunspot.config.pagination.default_per_page = 20
答案 3 :(得分:1)
您可以使用“点击”方法。
在控制器中
@search = User.search do
with :name, 'joe'
end
在视图中
<% @search.results.each do |result| %>
<%= result.name %>
<% end %>
<%= will_paginate @search.hits unless @search.nil? %>