0

我们将 Sunspot Solr 与 Rails 3.1 应用程序一起使用。我们有一个正在搜索的位置模型。这是搜索的代码

location_search = Location.search do
  keywords params[:search][:keywords] if params[:search][:keywords].present?
  with :category_ids, category_id if category_id.present?


  unless params[:search][:keywords].present?
      order_by :premium, :desc
  end

  if params[:search][:sort].present?
    field, direction = params[:search][:sort].split('-')
  else
    order_by :score, :desc
    order_by :random
  end
  paginate :page => params[:search][:page], :per_page => per_page
end

我的问题是如何让位置在结果中随机化,同时保持分页相同?意思是,我想对结果进行随机排序(不是按记录创建日期或名称),但我希望结果的第 2 页是相同的列表,即使我刷新页面(并将 2 传递给 params[:search][:page ])。理想情况下,当前用户会话的顺序将保持不变。

这样做的原因是我们网站上的位置付费是溢价的,所以溢价结果应该排在第一位,但是那些不付费的人应该是随机的,所以我们不喜欢位置,因为它们的创建顺序或基于名称的顺序.

谢谢!非常感谢您的帮助。

4

3 回答 3

3

前段时间,我还在研究一个已配置为返回随机排序顺序的分页集合。我意识到因为 sunspot 总是向 Solr 发送一个随机种子值,所以我会在页面之间间歇性地收到重复的结果。为了解决这个问题,我认为能够在搜索时配置种子值很有用。

我认为最有意义的实现将保留现有的语法规范,同时还允许 order_by 函数使用新的参数类型。

例如

Model.search do
  order_by :random, :seed => 12345, :direction => :asc 
end

我实现了这一点,并通过此拉取请求将其合并到sunspot_railsgem 的 master 中:https ://github.com/sunspot/sunspot/pull/328

于 2013-07-30T02:56:17.150 回答
0

您可以检索比需要大得多的页面,将其随机播放,然后将其缩小到合适的大小。也许是这样的(随机是 ruby​​ 1.9 类):

SUPER_PAGE_MULTIPLIER = 5

location_search = Location.search do
  keywords params[:search][:keywords] if params[:search][:keywords].present?
  with :category_ids, category_id if category_id.present?


  unless params[:search][:keywords].present?
      order_by :premium, :desc
  end

  if params[:search][:sort].present?
    field, direction = params[:search][:sort].split('-')
  else
    order_by :score, :desc
    # order_by :random
  end
  paginate :page => params[:search][:page] / SUPER_PAGE_MULTIPLIER, :per_page => per_page * SUPER_PAGE_MULTIPLIER
end

session[:seed] ||= rand(100000)
rng = Random.new(session[:seed])

too_many_results = location_search.results
too_many_results.shuffle!(rng)

results = too_many_results.slice((params[:search][:page] % SUPER_PAGE_MULTIPLIER) * per_page, per_page)
于 2012-12-13T19:45:15.047 回答
0

您可以使用与我在此处回答的有关一致随机种子的相同技术。

太阳黑子支持使用随机种子。请参阅此处的文档:https ://github.com/sunspot/sunspot/wiki/Ordering-and-pagination#pagination-with-random-ordering

因此,您要做的(有关详细信息,请参阅我的其他答案)是在用户会话中生成并存储一个随机数。然后将此数字用作随机检索方法的种子:

Sunspot.search(Post) do
  paginate(:page => 2, :per_page => 15)
  order_by(:random, :seed => session_specific_random_seed)
end
于 2016-04-02T16:05:25.290 回答