Ordering and pagination
Clone this wiki locally
Sunspot allows ordering on one or more non-text fields using the
order_by method in the search DSL (if no
order_by call is made, results are sorted by relevancy).
order_by may be called more than once, and the earlier calls will have higher ordering precedence than the later calls. Each call to the method should take the field name and either
Sunspot.search(Post) do order_by(:blog_id, :asc) order_by(:created_at, :desc) end
Note that ordering cannot be done on text fields, and if ordering is needed on a text field, then a separate string field can be defined on the same content.
Sunspot also provides two special arguments for the
order_by method. If
:random is passed to
order_by, Solr’s RandomSortField will be used to (usually) return results in a different order each time. If
:score is passed to
order_by, results will be sorted by relevancy, which can be useful if
order_by is called multiple times in order to secondary ordering methods in case of ties in the relevancy score.
In Solr, all searches are paginated . Sunspot sets a default of 30 results per page, although this can be changed globally (see below). To specify pagination explicitly, use the
paginate method, which takes two options:
:per_page (this should be familiar to anyone who has used WillPaginate).
:page is required.
Sunspot.search(Post) do paginate(:page => 2, :per_page => 15) end
You can use :page from the params, for eg:
Sunspot.search(Post) do paginate(:page => params[:page] || 1, :per_page => 2) end
Changing default pagination
The default number of results to return per page (if no pagination is specified for a particular search) can be changed using the configuration API:
Sunspot.config.pagination.default_per_page = 30
Pagination with random ordering
By specifying a seed value for the random sort order you can return a stable set of results allowing you to paginate randomly ordered results.
Sunspot.search(Post) do paginate(:page => 2, :per_page => 15) order_by(:random, :seed => 1234) end