diff --git a/src/Datasource/DatasourcePluginBase.php b/src/Datasource/DatasourcePluginBase.php
index 093b9e8..d71489d 100644
--- a/src/Datasource/DatasourcePluginBase.php
+++ b/src/Datasource/DatasourcePluginBase.php
@@ -137,7 +137,7 @@ public function getEntityTypeId() {
    * {@inheritdoc}
    */
   public function getItemIds($page = NULL) {
-    return array();
+    return NULL;
   }
 
   /**
diff --git a/src/Entity/Index.php b/src/Entity/Index.php
index 28c3f90..7734357 100644
--- a/src/Entity/Index.php
+++ b/src/Entity/Index.php
@@ -671,8 +671,7 @@ public function preprocessSearchQuery(QueryInterface $query) {
    * {@inheritdoc}
    */
   public function postprocessSearchResults(ResultSetInterface $results) {
-    /** @var $processor \Drupal\search_api\Processor\ProcessorInterface */
-    foreach (array_reverse($this->getProcessorsByStage(ProcessorInterface::STAGE_POSTPROCESS_QUERY)) as $processor) {
+    foreach ($this->getProcessorsByStage(ProcessorInterface::STAGE_POSTPROCESS_QUERY) as $processor) {
       $processor->postprocessSearchResults($results);
     }
   }
diff --git a/src/Plugin/search_api/processor/Highlight.php b/src/Plugin/search_api/processor/Highlight.php
index ebb41e8..dc73530 100644
--- a/src/Plugin/search_api/processor/Highlight.php
+++ b/src/Plugin/search_api/processor/Highlight.php
@@ -15,6 +15,8 @@
 /**
  * Adds a highlighted excerpt to results and highlights returned fields.
  *
+ * This processor won't run for queries with the "basic" processing level set.
+ *
  * @SearchApiProcessor(
  *   id = "highlight",
  *   label = @Translation("Highlight"),
@@ -168,7 +170,10 @@ public function submitConfigurationForm(array &$form, FormStateInterface $form_s
    * {@inheritdoc}
    */
   public function postprocessSearchResults(ResultSetInterface $results) {
-    if (!$results->getResultCount() || !($keys = $this->getKeywords($results->getQuery()))) {
+    $query = $results->getQuery();
+    if (!$results->getResultCount()
+      || $query->getProcessingLevel() != QueryInterface::PROCESSING_FULL
+      || !($keys = $this->getKeywords($query))) {
       return;
     }
 
diff --git a/src/Query/Query.php b/src/Query/Query.php
index 0d134fe..2c51e73 100644
--- a/src/Query/Query.php
+++ b/src/Query/Query.php
@@ -58,6 +58,15 @@ class Query implements QueryInterface {
   protected $parseMode = 'terms';
 
   /**
+   * The processing level for this search query.
+   *
+   * One of the \Drupal\search_api\Query\QueryInterface::PROCESSING_* constants.
+   *
+   * @var int
+   */
+  protected $processingLevel = self::PROCESSING_FULL;
+
+  /**
    * The language codes which should be searched by this query.
    *
    * @var string[]|null
@@ -355,6 +364,21 @@ public function range($offset = NULL, $limit = NULL) {
   /**
    * {@inheritdoc}
    */
+  public function getProcessingLevel() {
+    return $this->processingLevel;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setProcessingLevel($level) {
+    $this->processingLevel = $level;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function abort($error_message = NULL) {
     $this->aborted = isset($error_message) ? $error_message : TRUE;
   }
@@ -424,8 +448,9 @@ protected function shouldAbort() {
    * {@inheritdoc}
    */
   public function preExecute() {
-    // Make sure to only execute this once per query.
-    if (!$this->preExecuteRan) {
+    // Make sure to only execute this once per query, and not for queries with
+    // the "none" processing level.
+    if (!$this->preExecuteRan && $this->processingLevel != self::PROCESSING_NONE) {
       $this->preExecuteRan = TRUE;
 
       // Preprocess query.
@@ -444,6 +469,10 @@ public function preExecute() {
    * {@inheritdoc}
    */
   public function postExecute() {
+    if ($this->processingLevel == self::PROCESSING_NONE) {
+      return;
+    }
+
     // Postprocess results.
     $this->index->postprocessSearchResults($this->results);
 
diff --git a/src/Query/QueryInterface.php b/src/Query/QueryInterface.php
index f8f6f18..5a707d4 100644
--- a/src/Query/QueryInterface.php
+++ b/src/Query/QueryInterface.php
@@ -23,6 +23,33 @@
   const SORT_DESC = 'DESC';
 
   /**
+   * Constant representing a completely unprocessed search.
+   *
+   * No processors or hooks will be invoked for searches with this processing
+   * level.
+   */
+  const PROCESSING_NONE = 0;
+
+  /**
+   * Constant representing a search with only basic processing.
+   *
+   * Hook implementations or processors adding extra functionality, not
+   * necessary for a basic search, should ignore searches with this level.
+   *
+   * Typical examples for such "extra functionality" would be facets,
+   * spellchecking or highlighting.
+   */
+  const PROCESSING_BASIC = 1;
+
+  /**
+   * Constant representing a search with normal/full processing.
+   *
+   * This is the default for queries where no processing level has been
+   * explicitly set.
+   */
+  const PROCESSING_FULL = 2;
+
+  /**
    * Instantiates a new instance of this query class.
    *
    * @param \Drupal\search_api\IndexInterface $index
@@ -166,6 +193,29 @@ public function sort($field, $order = self::SORT_ASC);
   public function range($offset = NULL, $limit = NULL);
 
   /**
+   * Retrieves the processing level for this query.
+   *
+   * @return int
+   *   The processing level of this query, as one of the
+   *   \Drupal\search_api\Query\QueryInterface::PROCESSING_* constants.
+   *
+   * @see \Drupal\search_api\Query\QueryInterface::PROCESSING_NONE
+   * @see \Drupal\search_api\Query\QueryInterface::PROCESSING_BASIC
+   * @see \Drupal\search_api\Query\QueryInterface::PROCESSING_FULL
+   */
+  public function getProcessingLevel();
+
+  /**
+   * Sets the processing level for this query.
+   *
+   * @param int $level
+   *   The processing level of this query, as one of the
+   *   \Drupal\search_api\Query\QueryInterface::PROCESSING_* constants.
+   *
+   * @return $this
+   */
+  public function setProcessingLevel($level);
+  /**
    * Aborts this query.
    *
    * This will mean that, while the query object otherwise acts normally, it
diff --git a/tests/search_api_test/src/Plugin/search_api/processor/TestProcessor.php b/tests/search_api_test/src/Plugin/search_api/processor/TestProcessor.php
index 453d571..27b3cea 100644
--- a/tests/search_api_test/src/Plugin/search_api/processor/TestProcessor.php
+++ b/tests/search_api_test/src/Plugin/search_api/processor/TestProcessor.php
@@ -3,6 +3,8 @@
 namespace Drupal\search_api_test\Plugin\search_api\processor;
 
 use Drupal\search_api\Processor\ProcessorPluginBase;
+use Drupal\search_api\Query\QueryInterface;
+use Drupal\search_api\Query\ResultSetInterface;
 use Drupal\search_api_test\TestPluginTrait;
 
 /**
@@ -20,6 +22,27 @@ class TestProcessor extends ProcessorPluginBase {
   /**
    * {@inheritdoc}
    */
+  public function supportsStage($stage_identifier) {
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function preprocessSearchQuery(QueryInterface $query) {
+    $this->logMethodCall(__FUNCTION__, func_get_args());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function postprocessSearchResults(ResultSetInterface $results) {
+    $this->logMethodCall(__FUNCTION__, func_get_args());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function calculateDependencies() {
     return $this->configuration;
   }
diff --git a/tests/search_api_test_hooks/search_api_test_hooks.module b/tests/search_api_test_hooks/search_api_test_hooks.module
index 7b9aeae..a6a1a9d 100644
--- a/tests/search_api_test_hooks/search_api_test_hooks.module
+++ b/tests/search_api_test_hooks/search_api_test_hooks.module
@@ -21,7 +21,9 @@ function search_api_test_hooks_search_api_backend_info_alter(array &$backend_inf
  * Implements hook_search_api_datasource_info_alter.
  */
 function search_api_test_hooks_search_api_datasource_info_alter(array &$infos) {
-  $infos['entity:node']['label'] = 'Distant land';
+  if (isset($infos['entity:node'])) {
+    $infos['entity:node']['label'] = 'Distant land';
+  }
 }
 
 /**
@@ -55,6 +57,24 @@ function search_api_test_hooks_search_api_query_alter(QueryInterface &$query) {
 }
 
 /**
+ * Implements hook_search_api_query_TAG_alter.
+ */
+function search_api_test_hooks_search_api_query_andrew_hill_alter(QueryInterface &$query) {
+  // Exclude the node with ID 2 from the search results.
+  $query->setOption('tag query alter hook', TRUE);
+  $index = $query->getIndex();
+  $fields = $index->getFields();
+  foreach ($index->getDatasources() as $datasource_id => $datasource) {
+    if ($datasource->getEntityTypeId() == 'node') {
+      $field = Utility::createCombinedId($datasource_id, 'nid');
+      if (isset($fields[$field])) {
+        $query->addCondition($field, 2, '<>');
+      }
+    }
+  }
+}
+
+/**
  * Implements hook_search_api_results_alter.
  */
 function search_api_test_hooks_search_api_results_alter(ResultSetInterface &$results) {
@@ -62,6 +82,13 @@ function search_api_test_hooks_search_api_results_alter(ResultSetInterface &$res
 }
 
 /**
+ * Implements hook_search_api_results_TAG_alter.
+ */
+function search_api_test_hooks_search_api_results_andrew_hill_alter(ResultSetInterface &$results) {
+  drupal_set_message('Llama');
+}
+
+/**
  * Implements hook_search_api_index_reindex.
  */
 function search_api_test_hooks_search_api_index_reindex(IndexInterface $index, $clear = FALSE) {
@@ -84,27 +111,3 @@ function search_api_test_hooks_search_api_field_type_mapping_alter(array &$mappi
   $mapping['datetime_iso8601'] = FALSE;
   $mapping['timestamp'] = FALSE;
 }
-
-/**
- * Implements hook_search_api_query_TAG_alter.
- */
-function search_api_test_hooks_search_api_query_andrew_hill_alter(QueryInterface &$query) {
-  // Exclude the node with ID 2 from the search results.
-  $fields = $query->getIndex()->getFields();
-  foreach ($query->getIndex()->getDatasources() as $datasource_id => $datasource) {
-    if ($datasource->getEntityTypeId() == 'node') {
-      $field = Utility::createCombinedId($datasource_id, 'nid');
-      if (isset($fields[$field])) {
-        $query->addCondition($field, 2, '<>');
-      }
-    }
-  }
-}
-
-/**
- * Implements hook_search_api_results_TAG_alter.
- */
-function search_api_test_hooks_search_api_results_andrew_hill_alter(
-  ResultSetInterface &$results) {
-  drupal_set_message('Llama');
-}
diff --git a/tests/src/Kernel/QueryTest.php b/tests/src/Kernel/QueryTest.php
index f12f71a..d20f8fd 100644
--- a/tests/src/Kernel/QueryTest.php
+++ b/tests/src/Kernel/QueryTest.php
@@ -6,6 +6,8 @@
 use Drupal\search_api\Entity\Index;
 use Drupal\search_api\Entity\Server;
 use Drupal\search_api\Query\Query;
+use Drupal\search_api\Query\QueryInterface;
+use Drupal\search_api_test\PluginTestTrait;
 
 /**
  * Tests query functionality.
@@ -14,12 +16,15 @@
  */
 class QueryTest extends KernelTestBase {
 
+  use PluginTestTrait;
+
   /**
    * {@inheritdoc}
    */
   public static $modules = array(
     'search_api',
     'search_api_test',
+    'search_api_test_hooks',
     'language',
     'user',
     'system',
@@ -63,8 +68,14 @@ protected function setUp() {
       'id' => 'test_index',
       'status' => 1,
       'datasource_settings' => array(
-        'entity:entity_test' => array(
-          'plugin_id' => 'entity:entity_test',
+        'search_api_test' => array(
+          'plugin_id' => 'search_api_test',
+          'settings' => array(),
+        ),
+      ),
+      'processor_settings' => array(
+        'search_api_test' => array(
+          'plugin_id' => 'search_api_test',
           'settings' => array(),
         ),
       ),
@@ -81,6 +92,70 @@ protected function setUp() {
   }
 
   /**
+   * Tests that processing levels are working correctly.
+   *
+   * @param int $level
+   *   The processing level to test.
+   * @param bool $hooks_and_processors_invoked
+   *   (optional) Whether hooks and processors should be invoked with this
+   *   processing level.
+   *
+   * @dataProvider testProcessingLevelDataProvider
+   */
+  public function testProcessingLevel($level, $hooks_and_processors_invoked = TRUE) {
+    /** @var \Drupal\search_api\Processor\ProcessorInterface $processor */
+    $processor = $this->container->get('plugin.manager.search_api.processor')
+      ->createInstance('search_api_test', array('index' => $this->index));
+    $this->index->addProcessor($processor)->save();
+
+    $query = $this->index->query();
+    if ($level != QueryInterface::PROCESSING_FULL) {
+      $query->setProcessingLevel($level);
+    }
+    $this->assertEquals($level, $query->getProcessingLevel());
+    $query->addTag('andrew_hill');
+
+    $_SESSION['messages']['status'] = array();
+    $query->execute();
+    $messages = $_SESSION['messages']['status'];
+    $_SESSION['messages']['status'] = array();
+
+    $methods = $this->getCalledMethods('processor');
+    if ($hooks_and_processors_invoked) {
+      $expected = array(
+        'Funky blue note',
+        'Stepping into tomorrow',
+        'Llama',
+      );
+      $this->assertEquals($expected, $messages);
+      $this->assertTrue($query->getOption('tag query alter hook'));
+      $this->assertContains('preprocessSearchQuery', $methods);
+      $this->assertContains('postprocessSearchResults', $methods);
+    }
+    else {
+      $this->assertEmpty($messages);
+      $this->assertFalse($query->getOption('tag query alter hook'));
+      $this->assertNotContains('preprocessSearchQuery', $methods);
+      $this->assertNotContains('postprocessSearchResults', $methods);
+    }
+  }
+
+  /**
+   * Provides test data for the testProcessingLevel() method.
+   *
+   * @return array[]
+   *   Arrays of method arguments for the
+   *   \Drupal\Tests\search_api\Kernel\QueryTest::testProcessingLevel() method.
+   */
+  public function testProcessingLevelDataProvider() {
+    return array(
+      'none' => array(QueryInterface::PROCESSING_NONE, FALSE),
+      'basic' => array(QueryInterface::PROCESSING_BASIC),
+      'full' => array(QueryInterface::PROCESSING_FULL),
+    );
+  }
+
+  /**
    * Tests that queries can be cloned.
    */
   public function testQueryCloning() {
@@ -96,19 +171,6 @@ public function testQueryCloning() {
    * Tests that serialization of queries works correctly.
    */
   public function testQuerySerialization() {
-    $query = $this->prepareQuery();
-    $cloned_query = clone $query;
-    $unserialized_query = unserialize(serialize($query));
-    $this->assertEquals($cloned_query, $unserialized_query);
-  }
-
-  /**
-   * Prepares a query for testing purposes.
-   *
-   * @return \Drupal\search_api\Query\Query
-   *   A search query.
-   */
-  protected function prepareQuery() {
     $results_cache = $this->container->get('search_api.results_static_cache');
     $query = Query::create($this->index, $results_cache);
     $tags = array('tag1', 'tag2');
@@ -124,7 +186,10 @@ protected function prepareQuery() {
     $query->setOption('option1', array('foo' => 'bar'));
     $translation = $this->container->get('string_translation');
     $query->setStringTranslation($translation);
-    return $query;
+
+    $cloned_query = clone $query;
+    $unserialized_query = unserialize(serialize($query));
+    $this->assertEquals($cloned_query, $unserialized_query);
   }
 
 }
diff --git a/tests/src/Unit/Plugin/Processor/HighlightTest.php b/tests/src/Unit/Plugin/Processor/HighlightTest.php
index f87b972..48e632c 100644
--- a/tests/src/Unit/Plugin/Processor/HighlightTest.php
+++ b/tests/src/Unit/Plugin/Processor/HighlightTest.php
@@ -3,6 +3,7 @@
 namespace Drupal\Tests\search_api\Unit\Plugin\Processor;
 
 use Drupal\search_api\Plugin\search_api\processor\Highlight;
+use Drupal\search_api\Query\QueryInterface;
 use Drupal\search_api\Query\ResultSet;
 use Drupal\search_api\Utility;
 use Drupal\Tests\UnitTestCase;
@@ -72,8 +73,35 @@ public function testPostprocessSearchResultsWithEmptyResult() {
     /** @var \Drupal\search_api\Query\ResultSet $results */
 
     $this->processor->postprocessSearchResults($results);
-    $output = $results->getExtraData('highlighted_fields');
-    $this->assertEmpty($output, 'No highlighting data added to result set.');
+  }
+
+  /**
+   * Makes sure that queries with "basic" processing set are ignored.
+   */
+  public function testPostprocessBasicQuery() {
+    $query = $this->getMock('Drupal\search_api\Query\QueryInterface');
+    $query->expects($this->once())
+      ->method('getProcessingLevel')
+      ->willReturn(QueryInterface::PROCESSING_BASIC);
+
+    $results = $this->getMockBuilder('Drupal\search_api\Query\ResultSet')
+      ->setMethods(array('getResultCount', 'getQuery'))
+      ->setConstructorArgs(array($query))
+      ->getMock();
+
+    $results->expects($this->once())
+      ->method('getResultCount')
+      ->willReturn(1);
+    $results->expects($this->once())
+      ->method('getQuery')
+      ->will($this->returnValue($query));
+    $results->expects($this->never())
+      ->method('getItems');
+    $results->expects($this->never())
+      ->method('setExtraData');
+    /** @var \Drupal\search_api\Query\ResultSet $results */
+
+    $this->processor->postprocessSearchResults($results);
   }
 
   /**
@@ -81,6 +109,9 @@ public function testPostprocessSearchResultsWithEmptyResult() {
    */
   public function testPostprocessSearchResultsWithoutKeywords() {
     $query = $this->getMock('Drupal\search_api\Query\QueryInterface');
+    $query->expects($this->once())
+      ->method('getProcessingLevel')
+      ->willReturn(QueryInterface::PROCESSING_FULL);
 
     $results = $this->getMockBuilder('Drupal\search_api\Query\ResultSet')
       ->setMethods(array('getResultCount', 'getQuery'))
@@ -102,8 +133,6 @@ public function testPostprocessSearchResultsWithoutKeywords() {
     /** @var \Drupal\search_api\Query\ResultSet $results */
 
     $this->processor->postprocessSearchResults($results);
-    $output = $results->getExtraData('highlighted_fields');
-    $this->assertEmpty($output, 'No highlighting data added to result set.');
   }
 
   /**
@@ -111,6 +140,9 @@ public function testPostprocessSearchResultsWithoutKeywords() {
    */
   public function testPostprocessSearchResultsWithResults() {
     $query = $this->getMock('Drupal\search_api\Query\QueryInterface');
+    $query->expects($this->once())
+      ->method('getProcessingLevel')
+      ->willReturn(QueryInterface::PROCESSING_FULL);
     $query->expects($this->atLeastOnce())
       ->method('getKeys')
       ->will($this->returnValue('foo'));
@@ -154,6 +186,9 @@ public function testPostprocessSearchResultsWithChangedPrefixSuffix() {
     $this->processor->setConfiguration(array('prefix' => '<em>', 'suffix' => '</em>'));
 
     $query = $this->getMock('Drupal\search_api\Query\QueryInterface');
+    $query->expects($this->once())
+      ->method('getProcessingLevel')
+      ->willReturn(QueryInterface::PROCESSING_FULL);
     $query->expects($this->atLeastOnce())
       ->method('getKeys')
       ->will($this->returnValue(array('#conjunction' => 'AND', 'foo')));
@@ -197,6 +232,9 @@ public function testPostprocessSearchResultsWithoutHighlight() {
     $this->processor->setConfiguration(array('highlight' => 'never'));
 
     $query = $this->getMock('Drupal\search_api\Query\QueryInterface');
+    $query->expects($this->once())
+      ->method('getProcessingLevel')
+      ->willReturn(QueryInterface::PROCESSING_FULL);
     $query->expects($this->atLeastOnce())
       ->method('getKeys')
       ->will($this->returnValue(array('#conjunction' => 'AND', 'foo')));
@@ -238,6 +276,9 @@ public function testPostprocessSearchResultsWithoutHighlight() {
    */
   public function testPostprocessSearchResultsWithPreviousHighlighting() {
     $query = $this->getMock('Drupal\search_api\Query\QueryInterface');
+    $query->expects($this->once())
+      ->method('getProcessingLevel')
+      ->willReturn(QueryInterface::PROCESSING_FULL);
     $query->expects($this->atLeastOnce())
       ->method('getKeys')
       ->will($this->returnValue(array('#conjunction' => 'AND', 'foo')));
@@ -284,6 +325,9 @@ public function testPostprocessSearchResultsWithPreviousHighlighting() {
    */
   public function testPostprocessSearchResultsExcerpt() {
     $query = $this->getMock('Drupal\search_api\Query\QueryInterface');
+    $query->expects($this->once())
+      ->method('getProcessingLevel')
+      ->willReturn(QueryInterface::PROCESSING_FULL);
     $query->expects($this->atLeastOnce())
       ->method('getKeys')
       ->will($this->returnValue(array('#conjunction' => 'AND', 'congue')));
@@ -327,6 +371,9 @@ public function testPostprocessSearchResultsExcerpt() {
    */
   public function testPostprocessSearchResultsExerptMatchNearEnd() {
     $query = $this->getMock('Drupal\search_api\Query\QueryInterface');
+    $query->expects($this->once())
+      ->method('getProcessingLevel')
+      ->willReturn(QueryInterface::PROCESSING_FULL);
     $query->expects($this->atLeastOnce())
       ->method('getKeys')
       ->will($this->returnValue(array('#conjunction' => 'AND', 'diam')));
@@ -372,6 +419,9 @@ public function testPostprocessSearchResultsWithChangedExcerptLength() {
     $this->processor->setConfiguration(array('excerpt_length' => 64));
 
     $query = $this->getMock('Drupal\search_api\Query\QueryInterface');
+    $query->expects($this->once())
+      ->method('getProcessingLevel')
+      ->willReturn(QueryInterface::PROCESSING_FULL);
     $query->expects($this->atLeastOnce())
       ->method('getKeys')
       ->will($this->returnValue('congue'));
@@ -417,6 +467,9 @@ public function testPostprocessSearchResultsWithoutExcerpt() {
     $this->processor->setConfiguration(array('excerpt' => FALSE));
 
     $query = $this->getMock('Drupal\search_api\Query\QueryInterface');
+    $query->expects($this->once())
+      ->method('getProcessingLevel')
+      ->willReturn(QueryInterface::PROCESSING_FULL);
     $query->expects($this->atLeastOnce())
       ->method('getKeys')
       ->will($this->returnValue(array('#conjunction' => 'AND', 'congue')));
@@ -474,6 +527,9 @@ public function testPostprocessSearchResultsWithComplexKeys() {
       ),
     );
     $query = $this->getMock('Drupal\search_api\Query\QueryInterface');
+    $query->expects($this->once())
+      ->method('getProcessingLevel')
+      ->willReturn(QueryInterface::PROCESSING_FULL);
     $query->expects($this->atLeastOnce())
       ->method('getKeys')
       ->will($this->returnValue($keys));
@@ -519,6 +575,9 @@ public function testPostprocessSearchResultsWithComplexKeys() {
    */
   public function testPostprocessSearchResultsWithTwoFields() {
     $query = $this->getMock('Drupal\search_api\Query\QueryInterface');
+    $query->expects($this->once())
+      ->method('getProcessingLevel')
+      ->willReturn(QueryInterface::PROCESSING_FULL);
     $query->expects($this->atLeastOnce())
       ->method('getKeys')
       ->will($this->returnValue(array('#conjunction' => 'AND', 'foo')));
@@ -577,6 +636,9 @@ public function testPostprocessSearchResultsWithTwoFields() {
    */
   public function testPostprocessSearchResultsWithTwoItems() {
     $query = $this->getMock('Drupal\search_api\Query\QueryInterface');
+    $query->expects($this->once())
+      ->method('getProcessingLevel')
+      ->willReturn(QueryInterface::PROCESSING_FULL);
     $query->expects($this->atLeastOnce())
       ->method('getKeys')
       ->will($this->returnValue(array('#conjunction' => 'OR', 'foo')));
@@ -627,6 +689,9 @@ public function testPostprocessSearchResultsWithTwoItems() {
    */
   public function testExcerptExcludeFields() {
     $query = $this->getMock('Drupal\search_api\Query\QueryInterface');
+    $query->expects($this->once())
+      ->method('getProcessingLevel')
+      ->willReturn(QueryInterface::PROCESSING_FULL);
     $query->expects($this->atLeastOnce())
       ->method('getKeys')
       ->will($this->returnValue(array('#conjunction' => 'AND', 'foo')));
