Index: lucene/CHANGES.txt
===================================================================
--- lucene/CHANGES.txt	(revision 1403281)
+++ lucene/CHANGES.txt	(working copy)
@@ -86,6 +86,9 @@
 * LUCENE-4504: Fix broken sort comparator in ValueSource.getSortField,
   used when sorting by a function query.  (Tom Shally via Robert Muir)
 
+* LUCENE-4511: TermsFilter might return wrong results if a field is not 
+  indexed or doesn't exist in the index. (Simon Willnauer)
+
 Optimizations
 
 * LUCENE-4443: Lucene41PostingsFormat no longer writes unnecessary offsets 
Index: lucene/queries/src/test/org/apache/lucene/queries/TermsFilterTest.java
===================================================================
--- lucene/queries/src/test/org/apache/lucene/queries/TermsFilterTest.java	(revision 1403281)
+++ lucene/queries/src/test/org/apache/lucene/queries/TermsFilterTest.java	(working copy)
@@ -17,6 +17,7 @@
  * limitations under the License.
  */
 
+import java.io.IOException;
 import java.util.HashSet;
 
 import org.apache.lucene.document.Document;
@@ -120,5 +121,35 @@
     rd1.close();
     rd2.close();
   }
+  
+  public void testFieldNotPresent() throws IOException {
+    Directory dir = newDirectory();
+    RandomIndexWriter w = new RandomIndexWriter(random(), dir);
+    int num = atLeast(3);
+    int skip = random().nextInt(num);
+    TermsFilter tf = new TermsFilter();
+    
+    for (int i = 0; i < num; i++) {
+      tf.addTerm(new Term("field" + i, "content1"));
+      Document doc = new Document();
+      if (skip == i) {
+        continue;
+      }
+      doc.add(newStringField("field" + i, "content1", Field.Store.YES));
+      w.addDocument(doc);  
+    }
+    w.forceMerge(1);
+    IndexReader reader = w.getReader();
+    w.close();
+    assertEquals(1, reader.leaves().size());
+    
+    
+    
+    AtomicReaderContext context = reader.leaves().get(0);
+    FixedBitSet bits = (FixedBitSet) tf.getDocIdSet(context, context.reader().getLiveDocs());
+    assertEquals("Must be num fields - 1 since we skip only one field", num-1, bits.cardinality());  
+    reader.close();
+    dir.close();
+  }
 
 }
Index: lucene/queries/src/java/org/apache/lucene/queries/TermsFilter.java
===================================================================
--- lucene/queries/src/java/org/apache/lucene/queries/TermsFilter.java	(revision 1403281)
+++ lucene/queries/src/java/org/apache/lucene/queries/TermsFilter.java	(working copy)
@@ -70,7 +70,7 @@
       if (!term.field().equals(lastField)) {
         termsC = fields.terms(term.field());
         if (termsC == null) {
-          return result;
+          continue;
         }
         termsEnum = termsC.iterator(null);
         lastField = term.field();
