太阳黑子Solr全文搜索和will_paginate

Abr*_*ram 4 ruby-on-rails sunspot will-paginate

以下查询的工作方式类似于魅力:

@styles = Style.search { fulltext params[:q] }
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是分页.这是与分页相同的查询:

@styles = Style.search { fulltext params[:q]; paginate :page => params[:page], :per_page => params[:page_limit] }
Run Code Online (Sandbox Code Playgroud)

我有11 Style条记录.

如果我有:page => 1,:per_page => 10当我搜索第11条记录时,我会返回一个空数组@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...>]
Run Code Online (Sandbox Code Playgroud)

我认为重点是对搜索结果进行分页,而不是整个实际记录

这里发生了什么,我该如何解决?

编辑

好吧,让我试着用另一种方式解释.假设我有这六个记录:

1 => 'a'
2 => 'b'
3 => 'c'
4 => 'd'
5 => 'e'
6 => 'f'
Run Code Online (Sandbox Code Playgroud)

假设我试图搜索'f'

Letter.search { fulltext 'f'; paginate :page => 1, :per_page => 5 }
Run Code Online (Sandbox Code Playgroud)

我的结果将是一个空数组 []

现在让我说我试试

Letter.search { fulltext 'f'; paginate :page => 1, :per_page => 6 }
Run Code Online (Sandbox Code Playgroud)

现在我的结果是[6 =>'f']

rma*_*002 9

我的想法:

从solr获取结果,然后通过solr返回并对其进行分页的id搜索模型,如下所示:

@search = Sunspot.search(Snippet) do
   fulltext params[:search]
end
@styles = Style.where(id: @search.results.map(&:id)).page(params[:page]).per(5)
Run Code Online (Sandbox Code Playgroud)

我从文档中理解的是: 我没有尝试过

默认情况下,Sunspot请求Solr的前30个结果.这意味着您可以拥有100条可能与搜索条件匹配的记录,但您只会看到前30条记录,要查看其他记录,您必须将分页添加到solr搜索中,例如:

search = Style.search do
  fulltext "my cool style"
  paginate :page => 2
end
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您应该能够访问2页.要更新您需要编写的太阳黑子请求数:

search = Style.search do
  fulltext "my cool style"
  paginate :page => 1, :per_page => 50
end
Run Code Online (Sandbox Code Playgroud)

它应该在一页中给你50个结果,或者paginate :page => 2, :per_page => 50结果应该分成2页,每页最多50个结果.