0

Rails3.1アプリではSunspotSolrを使用しています。検索しているロケーションモデルがあります。これが検索のコードです

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をparams [:search] [:pageに渡しても)結果のページ2を同じリストにしたいのです。 ])。理想的には、現在のユーザーセッションの順序は同じままです。

この理由は、サイト上の場所はプレミアムであるため、プレミアムの結果が最初に表示されるためですが、支払わない人はランダム化する必要があるため、作成された順序または名前に基づく順序のために場所を優先しません。

ありがとう!ヘルプは本当にありがたいです。

4

3 に答える 3

3

少し前に、ランダムな並べ替え順序を返すように構成されたページ付けされたコレクションにも取り組んでいました。太陽黒点は常に Solr にランダムなシード値を送信するため、断続的にページ間で重複した結果を受け取ることに気付きました。これを修正するには、検索中にシード値を設定できると便利だと思いました。

私が最も理にかなっていると考えた実装は、既存の構文仕様を保持しながら、order_by 関数に新しいパラメーター型を許可するものです。

例えば

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

sunspot_rails私はこれを実装し、このプル リクエストで gemのマスターにマージしました: https://github.com/sunspot/sunspot/pull/328

于 2013-07-30T02:56:17.150 に答える
0

ここで一貫したランダムシードについて答えたのと同じ手法を使用できます。

Sunspot は、ランダム シードの使用をサポートしています。こちらのドキュメントを参照してください: 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 に答える
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 に答える