4

以下查询就像一个魅力:

@styles = Style.search { fulltext params[:q] }

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

@styles = Style.search { fulltext params[:q]; paginate :page => params[:page], :per_page => params[:page_limit] }

我有 11Style条记录。

如果我有: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...>]

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

这是怎么回事,我该如何解决?

编辑

好的,让我尝试用另一种方式解释这一点。假设我有这六条记录:

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 => 'f']

4

4 回答 4

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)

我从文档中了解到的: 我没有尝试过

默认情况下,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 个结果。

于 2013-08-03T21:54:40.637 回答
2

尝试提供一个后备,per_page像这样:

@search = Style.search do
  fulltext params[:q]
  paginate(page: params[:page], per_page: (params[:per] || 15))
end
于 2013-08-01T03:14:42.317 回答
1

您可以使用“命中”方法。

在控制器中

@search = User.search do 
  with :name, 'joe'
end

在视图中

<% @search.results.each do |result| %>
    <%= result.name %>
<% end %>

<%= will_paginate @search.hits unless @search.nil? %>
于 2014-01-07T18:46:52.690 回答
1

我也面临同样的问题。所以我在搜索中删除了 :per_page 标签

并将我的查询更改为

@styles = Style.search { fulltext params[:q]; paginate :page => params[:page]}

为了设置 per_page_limit,我在初始化程序中使用了以下代码

Sunspot.config.pagination.default_per_page = 20
于 2013-07-30T14:08:45.220 回答