protected function SearchApiSolrBackend::setSorts in Search API Solr 8
Same name and namespace in other branches
- 8.3 src/Plugin/search_api/backend/SearchApiSolrBackend.php \Drupal\search_api_solr\Plugin\search_api\backend\SearchApiSolrBackend::setSorts()
- 8.2 src/Plugin/search_api/backend/SearchApiSolrBackend.php \Drupal\search_api_solr\Plugin\search_api\backend\SearchApiSolrBackend::setSorts()
- 4.x src/Plugin/search_api/backend/SearchApiSolrBackend.php \Drupal\search_api_solr\Plugin\search_api\backend\SearchApiSolrBackend::setSorts()
Sets sorting for the query.
1 call to SearchApiSolrBackend::setSorts()
- SearchApiSolrBackend::search in src/
Plugin/ search_api/ backend/ SearchApiSolrBackend.php - Options on $query prefixed by 'solr_param_' will be passed natively to Solr as query parameter without the prefix. For example you can set the "Minimum Should Match" parameter 'mm' to '75%' like this:
File
- src/
Plugin/ search_api/ backend/ SearchApiSolrBackend.php, line 2704
Class
- SearchApiSolrBackend
- Apache Solr backend for search api.
Namespace
Drupal\search_api_solr\Plugin\search_api\backendCode
protected function setSorts(Query $solarium_query, QueryInterface $query, $field_names = []) {
$new_schema_version = version_compare($this
->getSolrConnector()
->getSchemaVersion(), '4.4', '>=');
foreach ($query
->getSorts() as $field => $order) {
$f = '';
// First wee need to handle special fields which are prefixed by
// 'search_api_'. Otherwise they will erroneously be treated as dynamic
// string fields by the next detection below because they start with an
// 's'. This way we for example ensure that search_api_relevance isn't
// modified at all.
if (strpos($field, 'search_api_') === 0) {
if ($field == 'search_api_random') {
// The default Solr schema provides a virtual field named "random_*"
// that can be used to randomly sort the results; the field is
// available only at query-time. See schema.xml for more details about
// how the "seed" works.
$params = $query
->getOption('search_api_random_sort', []);
// Random seed: getting the value from parameters or computing a new
// one.
$seed = !empty($params['seed']) ? $params['seed'] : mt_rand();
$f = $field_names[$field] . '_' . $seed;
}
}
elseif ($new_schema_version) {
// @todo Both detections are redundant to some parts of
// SearchApiSolrBackend::getDocuments(). They should be combined in a
// single place to avoid errors in the future.
if (strpos($field_names[$field], 't') === 0 || strpos($field_names[$field], 's') === 0) {
// For fulltext fields use the dedicated sort field for faster alpha
// sorts. Use the same field for strings to sort on a normalized
// value.
$f = 'sort_' . $field;
}
elseif (preg_match('/^([a-z]+)m(_.*)/', $field_names[$field], $matches)) {
// For other multi-valued fields (which aren't sortable by nature) we
// use the same hackish workaround like the DB backend: just copy the
// first value in a single value field for sorting.
$f = $matches[1] . 's' . $matches[2];
}
}
if (!$f) {
$f = $field_names[$field];
}
$solarium_query
->addSort($f, strtolower($order));
}
}