diff --git a/src/pattern.go b/src/pattern.go
index 731104f84cf25eba3138c96b2ec8bc622b58f730..4f646607e6b5f19aa0efd93e3b40b830565739e2 100644
--- a/src/pattern.go
+++ b/src/pattern.go
@@ -101,7 +101,7 @@ func BuildPattern(fuzzy bool, fuzzyAlgo algo.Algo, extended bool, caseMode Case,
 			for idx, term := range termSet {
 				// If the query contains inverse search terms or OR operators,
 				// we cannot cache the search scope
-				if !cacheable || idx > 0 || term.inv {
+				if !cacheable || idx > 0 || term.inv || !fuzzy && term.typ != termExact {
 					cacheable = false
 					break Loop
 				}
diff --git a/src/pattern_test.go b/src/pattern_test.go
index ea0082f3a21b3120b81670aa91fa4621e736f3b6..9d66c798f7a9b4fb778fdaa03146df90362e3fbd 100644
--- a/src/pattern_test.go
+++ b/src/pattern_test.go
@@ -186,3 +186,21 @@ func TestCacheKey(t *testing.T) {
 	test(true, "foo | bar !baz", "", false)
 	test(true, "| | | foo", "foo", true)
 }
+
+func TestCacheable(t *testing.T) {
+	test := func(fuzzy bool, str string, cacheable bool) {
+		clearPatternCache()
+		pat := BuildPattern(fuzzy, algo.FuzzyMatchV2, true, CaseSmart, true, true, true, []Range{}, Delimiter{}, []rune(str))
+		if cacheable != pat.cacheable {
+			t.Errorf("Invalid Pattern.cacheable for \"%s\": %v (expected: %v)", str, pat.cacheable, cacheable)
+		}
+	}
+	test(true, "foo bar", true)
+	test(true, "foo 'bar", true)
+	test(true, "foo !bar", false)
+
+	test(false, "foo bar", true)
+	test(false, "foo '", true)
+	test(false, "foo 'bar", false)
+	test(false, "foo !bar", false)
+}