diff -u b/src/Plugin/search_api/processor/Highlight.php b/src/Plugin/search_api/processor/Highlight.php
--- b/src/Plugin/search_api/processor/Highlight.php
+++ b/src/Plugin/search_api/processor/Highlight.php
@@ -472,14 +472,6 @@
     if ($context_length < 32) {
       $context_length = round($excerpt_length / 2) - 1;
     }
-    $ellipses = $this->getEllipses();
-
-    // If no keys are given, return an excerpt from the beginning.
-    if (empty($keys)) {
-      $out = substr($text, 0, $excerpt_length);
-      $excerpt = implode($ellipses[1], [$out]) . $ellipses[2];
-      return $excerpt;
-    }
 
     while ($length < $excerpt_length && !empty($remaining_keys)) {
       $found_keys = [];
@@ -574,9 +566,20 @@
       // if any.
       $remaining_keys = $found_keys;
     }
+    
+    $ellipses = $this->getEllipses();
 
+    // If no keys are given or no keys match the excerpt, return an excerpt from
+    // the beginning.
     if (!$ranges) {
-      // We didn't find any keyword matches, return NULL.
+      // Do not return an excerpt on an empty keyword if not requested by configuration.
+      $excerpt_always = $this->configuration['excerpt_always'];
+      if ($excerpt_always) {
+        $out = substr($text, 0, $excerpt_length);
+        $excerpt = implode($ellipses[1], [$out]) . $ellipses[2];
+        return $excerpt;
+      }
+
       return NULL;
     }
 
@@ -595,6 +598,7 @@
       return NULL;
     }
 
+    $ellipses = $this->getEllipses();
     $excerpt = $ellipses[0] . implode($ellipses[1], $out) . $ellipses[2];
 
     // Since we stripped the tags at the beginning, highlighting doesn't need to
@@ -616,7 +620,6 @@
       return NULL;
     }
 
-    $ellipses = $this->getEllipses();
     $excerpt = $ellipses[0] . implode($ellipses[1], $out) . $ellipses[2];
 
     // Since we stripped the tags at the beginning, highlighting doesn't need to
