diff --git a/src/Plugin/search_api/backend/SearchApiSolrBackend.php b/src/Plugin/search_api/backend/SearchApiSolrBackend.php
index a62d140..94e2abd 100644
--- a/src/Plugin/search_api/backend/SearchApiSolrBackend.php
+++ b/src/Plugin/search_api/backend/SearchApiSolrBackend.php
@@ -771,7 +771,7 @@ class SearchApiSolrBackend extends BackendPluginBase implements SolrBackendInter
       }
       $doc->setField('site', $base_urls[$lang]);
       $item_fields = $item->getFields();
-      $item_fields += $this->getSpecialFields($index, $item);
+      $item_fields += $special_fields = $this->getSpecialFields($index, $item);
       /** @var \Drupal\search_api\Item\FieldInterface $field */
       foreach ($item_fields as $name => $field) {
         // If the field is not known for the index, something weird has
@@ -787,7 +787,7 @@ class SearchApiSolrBackend extends BackendPluginBase implements SolrBackendInter
           break;
         }
         $this->addIndexField($doc, $field_names[$name], $field->getValues(), $field->getType());
-        if (version_compare($schema_version, '4.4', '>=')) {
+        if (!array_key_exists($name, $special_fields) && version_compare($schema_version, '4.4', '>=')) {
           $values = $field->getValues();
           $first_value = reset($values);
           if ($first_value) {
diff --git a/src/Solr/SolrHelper.php b/src/Solr/SolrHelper.php
index 34c76c4..05202fe 100644
--- a/src/Solr/SolrHelper.php
+++ b/src/Solr/SolrHelper.php
@@ -745,32 +745,47 @@ class SolrHelper {
   /**
    * Sets sorting for the query.
    */
-  public function setSorts(Query $solarium_query, QueryInterface $query, $field_names = array()) {
+  public function setSorts(Query $solarium_query, QueryInterface $query, $field_names = []) {
     $new_schema_version = version_compare($this->getSchemaVersion(), '4.4', '>=');
     foreach ($query->getSorts() as $field => $order) {
       $f = '';
-      // 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;
-      }
-      elseif ($new_schema_version && (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 ($new_schema_version && preg_match('/^([a-z]+)m(_.*)/', $field_names[$field], $matches)) {
-        // For 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];
+      // 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;
+        }
       }
-      else {
+      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];
       }
 
