diff --git a/lib/shared/search-index.js b/lib/shared/search-index.js
--- a/lib/shared/search-index.js
+++ b/lib/shared/search-index.js
@@ -26,24 +26,28 @@
     this.partialTextIndex = {};
   }
 
+  addAllPrefixes(id: string, value: string): void {
+    if (this.fullTextIndex[value] === undefined) {
+      this.fullTextIndex[value] = new Set();
+    }
+    this.fullTextIndex[value].add(id);
+    let partialString = '';
+    for (let i = 0; i < value.length; i++) {
+      const char = value[i];
+      partialString += char;
+      // TODO probably should do some stopwords here
+      if (this.partialTextIndex[partialString] === undefined) {
+        this.partialTextIndex[partialString] = new Set();
+      }
+      this.partialTextIndex[partialString].add(id);
+    }
+  }
+
   addEntry(id: string, rawText: string) {
     const keywords = this.tokenize(rawText);
     for (const keyword of keywords) {
       const value = keyword.value.toLowerCase();
-      if (this.fullTextIndex[value] === undefined) {
-        this.fullTextIndex[value] = new Set();
-      }
-      this.fullTextIndex[value].add(id);
-      let partialString = '';
-      for (let i = 0; i < value.length; i++) {
-        const char = value[i];
-        partialString += char;
-        // TODO probably should do some stopwords here
-        if (this.partialTextIndex[partialString] === undefined) {
-          this.partialTextIndex[partialString] = new Set();
-        }
-        this.partialTextIndex[partialString].add(id);
-      }
+      this.addAllPrefixes(id, value);
     }
   }
 
diff --git a/lib/shared/sentence-prefix-search-index.js b/lib/shared/sentence-prefix-search-index.js
new file mode 100644
--- /dev/null
+++ b/lib/shared/sentence-prefix-search-index.js
@@ -0,0 +1,34 @@
+// @flow
+
+import Tokenizer from 'tokenize-text';
+
+import SearchIndex from './search-index.js';
+
+class SentencePrefixSearchIndex extends SearchIndex {
+  entries: Set<string>;
+
+  constructor() {
+    super();
+    this.tokenize = new Tokenizer().re(/\S+/);
+    this.entries = new Set();
+  }
+
+  addEntry(id: string, rawText: string) {
+    const keywords = this.tokenize(rawText);
+    for (const keyword of keywords) {
+      const value = rawText.slice(keyword.index).toLowerCase();
+      this.addAllPrefixes(id, value);
+    }
+    this.entries.add(id);
+  }
+
+  getSearchResults(query: string): string[] {
+    const transformedQuery = query.toLowerCase();
+    if (this.partialTextIndex[transformedQuery]) {
+      return Array.from(this.partialTextIndex[transformedQuery]);
+    }
+    return [];
+  }
+}
+
+export default SentencePrefixSearchIndex;