diff --git a/src/Plugin/search_api/backend/SearchApiSolrBackend.php b/src/Plugin/search_api/backend/SearchApiSolrBackend.php index 465f649..16f93ea 100644 --- a/src/Plugin/search_api/backend/SearchApiSolrBackend.php +++ b/src/Plugin/search_api/backend/SearchApiSolrBackend.php @@ -423,6 +423,7 @@ class SearchApiSolrBackend extends BackendPluginBase { //'search_api_facets_operator_or', //'search_api_grouping', 'search_api_mlt', + 'search_api_random_sort', 'search_api_spellcheck', //'search_api_data_type_location', //'search_api_data_type_geohash', @@ -980,6 +981,7 @@ class SearchApiSolrBackend extends BackendPluginBase { $ret = array( 'search_api_id' => 'item_id', 'search_api_relevance' => 'score', + 'search_api_random' => 'random', ); // Add the names of any fields configured on the index. diff --git a/src/Solr/SolrHelper.php b/src/Solr/SolrHelper.php index 32892d4..79b79f5 100644 --- a/src/Solr/SolrHelper.php +++ b/src/Solr/SolrHelper.php @@ -480,10 +480,23 @@ class SolrHelper { public function setSorts(Query $solarium_query, QueryInterface $query, $field_names_single_value = array()) { foreach ($query->getSorts() as $field => $order) { - $f = $field_names_single_value[$field]; - if (substr($f, 0, 3) == 'ss_') { - $f = 'sort_' . substr($f, 3); + // The default Solr schema provides a virtual field named "random_SEED" + // that can be used to randomly sort the results; the field is available + // only at query-time. + if ($field == 'search_api_random') { + $params = $query->getOption('search_api_random_sort', array()); + // Random seed: getting the value from parameters or computing a new + // one. + $seed = !empty($params['seed']) ? $params['seed'] : mt_rand(); + $f = 'random_' . $seed; } + else { + $f = $field_names_single_value[$field]; + if (substr($f, 0, 3) == 'ss_') { + $f = 'sort_' . substr($f, 3); + } + } + $solarium_query->addSort($f, strtolower($order)); } }