diff --git a/includes/processor.inc b/includes/processor.inc
index 4cfaa4c..e85995c 100644
--- a/includes/processor.inc
+++ b/includes/processor.inc
@@ -329,10 +329,20 @@ abstract class SearchApiAbstractProcessor implements SearchApiProcessorInterface
    */
   protected function processFilters(array &$filters) {
     $fields = $this->index->options['fields'];
-    foreach ($filters as &$f) {
+    foreach ($filters as $key => &$f) {
       if (is_array($f)) {
         if (isset($fields[$f[0]]) && $this->testField($f[0], $fields[$f[0]])) {
+          // We want to allow processors also to easily remove complete filters.
+          // However, we can't use empty() or the like, as that would sort out
+          // filters for 0 or NULL. So we specifically check only for the empty
+          // string, and we also make sure the filter value was actually changed
+          // by storing whether it was empty before.
+          $empty_string = $f[1] === '';
           $this->processFilterValue($f[1]);
+
+          if ($f[1] === '' && !$empty_string) {
+            unset($filters[$key]);
+          }
         }
       }
       else {
diff --git a/includes/processor_ignore_case.inc b/includes/processor_ignore_case.inc
index fd5d7e9..476609d 100644
--- a/includes/processor_ignore_case.inc
+++ b/includes/processor_ignore_case.inc
@@ -6,7 +6,10 @@
 class SearchApiIgnoreCase extends SearchApiAbstractProcessor {
 
   protected function process(&$value) {
-    $value = drupal_strtolower($value);
+    // We don't touch integers, NULL values or the like.
+    if (is_string($value)) {
+      $value = drupal_strtolower($value);
+    }
   }
 
 }
diff --git a/includes/processor_stopwords.inc b/includes/processor_stopwords.inc
index ddbd040..70866a2 100644
--- a/includes/processor_stopwords.inc
+++ b/includes/processor_stopwords.inc
@@ -57,7 +57,7 @@ class SearchApiStopWords extends SearchApiAbstractProcessor {
 
   public function process(&$value) {
     $stopwords = $this->getStopWords();
-    if (empty($stopwords)) {
+    if (empty($stopwords) && !is_string($value)) {
       return;
     }
     $words = preg_split('/\s+/', $value);
diff --git a/includes/processor_tokenizer.inc b/includes/processor_tokenizer.inc
index ba04d1d..0fa422d 100644
--- a/includes/processor_tokenizer.inc
+++ b/includes/processor_tokenizer.inc
@@ -76,12 +76,15 @@ class SearchApiTokenizer extends SearchApiAbstractProcessor {
   }
 
   protected function process(&$value) {
-    $this->prepare();
-    if ($this->ignorable) {
-      $value = preg_replace('/' . $this->ignorable . '+/u', '', $value);
-    }
-    if ($this->spaces) {
-      $value = preg_replace('/' . $this->spaces . '+/u', ' ', $value);
+    // We don't touch integers, NULL values or the like.
+    if (is_string($value)) {
+      $this->prepare();
+      if ($this->ignorable) {
+        $value = preg_replace('/' . $this->ignorable . '+/u', '', $value);
+      }
+      if ($this->spaces) {
+        $value = preg_replace('/' . $this->spaces . '+/u', ' ', $value);
+      }
     }
   }
 
diff --git a/includes/processor_transliteration.inc b/includes/processor_transliteration.inc
index 8059f43..ade2370 100644
--- a/includes/processor_transliteration.inc
+++ b/includes/processor_transliteration.inc
@@ -6,7 +6,10 @@
 class SearchApiTransliteration extends SearchApiAbstractProcessor {
 
   protected function process(&$value) {
-    $value = transliteration_get($value, '', language_default('language'));
+    // We don't touch integers, NULL values or the like.
+    if (is_string($value)) {
+      $value = transliteration_get($value, '', language_default('language'));
+    }
   }
 
 }
