Index: src/test/org/apache/lucene/queryParser/TestMultiFieldQueryParser.java
===================================================================
--- src/test/org/apache/lucene/queryParser/TestMultiFieldQueryParser.java	(revision 397330)
+++ src/test/org/apache/lucene/queryParser/TestMultiFieldQueryParser.java	(working copy)
@@ -25,6 +25,7 @@
 import org.apache.lucene.document.Field;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.CheckHits;
 import org.apache.lucene.search.Hits;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.Query;
@@ -222,7 +223,7 @@
       new MultiFieldQueryParser(new String[] {"body"}, analyzer);
     mfqp.setDefaultOperator(QueryParser.Operator.AND);
     Query q = mfqp.parse("the footest");
-    IndexSearcher is = new IndexSearcher(ramDir);
+    IndexSearcher is = new CheckHits.ExplanationAssertingSearcher(ramDir);
     Hits hits = is.search(q);
     assertEquals(1, hits.length());
     is.close();
Index: src/test/org/apache/lucene/queryParser/TestQueryParser.java
===================================================================
--- src/test/org/apache/lucene/queryParser/TestQueryParser.java	(revision 397330)
+++ src/test/org/apache/lucene/queryParser/TestQueryParser.java	(working copy)
@@ -31,6 +31,7 @@
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.search.BooleanQuery;
 import org.apache.lucene.search.FuzzyQuery;
+import org.apache.lucene.search.CheckHits;
 import org.apache.lucene.search.Hits;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.PhraseQuery;
@@ -560,7 +561,7 @@
     addDateDoc("a", 2005, 12, 2, 10, 15, 33, iw);
     addDateDoc("b", 2005, 12, 4, 22, 15, 00, iw);
     iw.close();
-    IndexSearcher is = new IndexSearcher(ramDir);
+    IndexSearcher is = new CheckHits.ExplanationAssertingSearcher(ramDir);
     assertHits(1, "[12/1/2005 TO 12/3/2005]", is);
     assertHits(2, "[12/1/2005 TO 12/4/2005]", is);
     assertHits(1, "[12/3/2005 TO 12/4/2005]", is);
Index: src/test/org/apache/lucene/analysis/TestKeywordAnalyzer.java
===================================================================
--- src/test/org/apache/lucene/analysis/TestKeywordAnalyzer.java	(revision 397330)
+++ src/test/org/apache/lucene/analysis/TestKeywordAnalyzer.java	(working copy)
@@ -23,6 +23,7 @@
 import org.apache.lucene.document.Field;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.Query;
+import org.apache.lucene.search.CheckHits;
 import org.apache.lucene.search.Hits;
 import org.apache.lucene.queryParser.QueryParser;
 
@@ -44,7 +45,7 @@
 
     writer.close();
 
-    searcher = new IndexSearcher(directory);
+    searcher = new CheckHits.ExplanationAssertingSearcher(directory);
   }
 
   public void testPerFieldAnalyzer() throws Exception {
Index: src/test/org/apache/lucene/SearchTest.java
===================================================================
--- src/test/org/apache/lucene/SearchTest.java	(revision 397330)
+++ src/test/org/apache/lucene/SearchTest.java	(working copy)
@@ -48,7 +48,7 @@
       }
       writer.close();
 
-      Searcher searcher = new IndexSearcher(directory);
+      Searcher searcher = new CheckHits.ExplanationAssertingSearcher(directory);
       
       String[] queries = {
 // 	"a b",
Index: src/test/org/apache/lucene/TestSearch.java
===================================================================
--- src/test/org/apache/lucene/TestSearch.java	(revision 397330)
+++ src/test/org/apache/lucene/TestSearch.java	(working copy)
@@ -96,7 +96,7 @@
       }
       writer.close();
 
-      Searcher searcher = new IndexSearcher(directory);
+      Searcher searcher = new CheckHits.ExplanationAssertingSearcher(directory);
 
       String[] queries = {
         "a b",
Index: src/test/org/apache/lucene/TestDemo.java
===================================================================
--- src/test/org/apache/lucene/TestDemo.java	(revision 397330)
+++ src/test/org/apache/lucene/TestDemo.java	(working copy)
@@ -24,6 +24,7 @@
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.queryParser.ParseException;
 import org.apache.lucene.queryParser.QueryParser;
+import org.apache.lucene.search.CheckHits;
 import org.apache.lucene.search.Hits;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.Query;
@@ -59,7 +60,7 @@
     iwriter.close();
     
     // Now search the index:
-    IndexSearcher isearcher = new IndexSearcher(directory);
+    IndexSearcher isearcher = new CheckHits.ExplanationAssertingSearcher(directory);
     // Parse a simple query that searches for "text":
       QueryParser parser = new QueryParser("fieldname", analyzer);
     Query query = parser.parse("text");
Index: src/test/org/apache/lucene/search/TestNot.java
===================================================================
--- src/test/org/apache/lucene/search/TestNot.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestNot.java	(working copy)
@@ -46,7 +46,7 @@
     writer.optimize();
     writer.close();
 
-    Searcher searcher = new IndexSearcher(store);
+    Searcher searcher = new CheckHits.ExplanationAssertingSearcher(store);
       QueryParser parser = new QueryParser("field", new SimpleAnalyzer());
     Query query = parser.parse("a NOT b");
     //System.out.println(query);
Index: src/test/org/apache/lucene/search/TestBoolean2.java
===================================================================
--- src/test/org/apache/lucene/search/TestBoolean2.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestBoolean2.java	(working copy)
@@ -51,7 +51,7 @@
       writer.addDocument(doc);
     }
     writer.close();
-    searcher = new IndexSearcher(directory);
+    searcher = new CheckHits.ExplanationAssertingSearcher(directory);
   }
 
   private String[] docFields = {
Index: src/test/org/apache/lucene/search/TestRemoteSearchable.java
===================================================================
--- src/test/org/apache/lucene/search/TestRemoteSearchable.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestRemoteSearchable.java	(working copy)
@@ -61,7 +61,7 @@
 
     // publish it
     LocateRegistry.createRegistry(1099);
-    Searchable local = new IndexSearcher(indexStore);
+    Searchable local = new CheckHits.ExplanationAssertingSearcher(indexStore);
     RemoteSearchable impl = new RemoteSearchable(local);
     Naming.rebind("//localhost/Searchable", impl);
   }
Index: src/test/org/apache/lucene/search/TestPhraseQuery.java
===================================================================
--- src/test/org/apache/lucene/search/TestPhraseQuery.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestPhraseQuery.java	(working copy)
@@ -66,7 +66,7 @@
     writer.optimize();
     writer.close();
 
-    searcher = new IndexSearcher(directory);
+    searcher = new CheckHits.ExplanationAssertingSearcher(directory);
     query = new PhraseQuery();
   }
 
@@ -178,7 +178,7 @@
     writer.addDocument(doc);
     writer.close();
 
-    IndexSearcher searcher = new IndexSearcher(directory);
+    IndexSearcher searcher = new CheckHits.ExplanationAssertingSearcher(directory);
 
     // valid exact phrase query
     PhraseQuery query = new PhraseQuery();
@@ -213,7 +213,7 @@
     writer.optimize();
     writer.close();
     
-    IndexSearcher searcher = new IndexSearcher(directory);
+    IndexSearcher searcher = new CheckHits.ExplanationAssertingSearcher(directory);
     
     PhraseQuery phraseQuery = new PhraseQuery();
     phraseQuery.add(new Term("source", "marketing"));
@@ -246,7 +246,7 @@
     writer.optimize();
     writer.close();
     
-    searcher = new IndexSearcher(directory);
+    searcher = new CheckHits.ExplanationAssertingSearcher(directory);
     
     termQuery = new TermQuery(new Term("contents","woo"));
     phraseQuery = new PhraseQuery();
@@ -293,7 +293,7 @@
     writer.optimize();
     writer.close();
 
-    Searcher searcher = new IndexSearcher(directory);
+    Searcher searcher = new CheckHits.ExplanationAssertingSearcher(directory);
     PhraseQuery query = new PhraseQuery();
     query.add(new Term("field", "firstname"));
     query.add(new Term("field", "lastname"));
Index: src/test/org/apache/lucene/search/TestPositionIncrement.java
===================================================================
--- src/test/org/apache/lucene/search/TestPositionIncrement.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestPositionIncrement.java	(working copy)
@@ -69,7 +69,7 @@
     writer.optimize();
     writer.close();
 
-    IndexSearcher searcher = new IndexSearcher(store);
+    IndexSearcher searcher = new CheckHits.ExplanationAssertingSearcher(store);
     PhraseQuery q;
     Hits hits;
 
Index: src/test/org/apache/lucene/search/TestFuzzyQuery.java
===================================================================
--- src/test/org/apache/lucene/search/TestFuzzyQuery.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestFuzzyQuery.java	(working copy)
@@ -45,7 +45,7 @@
     addDoc("ddddd", writer);
     writer.optimize();
     writer.close();
-    IndexSearcher searcher = new IndexSearcher(directory);
+    IndexSearcher searcher = new CheckHits.ExplanationAssertingSearcher(directory);
 
     FuzzyQuery query = new FuzzyQuery(new Term("field", "aaaaa"), FuzzyQuery.defaultMinSimilarity, 0);   
     Hits hits = searcher.search(query);
@@ -168,7 +168,7 @@
     addDoc("segment", writer);
     writer.optimize();
     writer.close();
-    IndexSearcher searcher = new IndexSearcher(directory);
+    IndexSearcher searcher = new CheckHits.ExplanationAssertingSearcher(directory);
 
     FuzzyQuery query;
     // not similar enough:
Index: src/test/org/apache/lucene/search/TestBooleanMinShouldMatch.java
===================================================================
--- src/test/org/apache/lucene/search/TestBooleanMinShouldMatch.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestBooleanMinShouldMatch.java	(working copy)
@@ -72,7 +72,7 @@
         writer.close();
 
         r = IndexReader.open(index);
-        s = new IndexSearcher(r);
+        s = new CheckHits.ExplanationAssertingSearcher(r);
 
 //System.out.println("Set up " + getName());
     }
Index: src/test/org/apache/lucene/search/TestBooleanOr.java
===================================================================
--- src/test/org/apache/lucene/search/TestBooleanOr.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestBooleanOr.java	(working copy)
@@ -157,6 +157,6 @@
 		writer.close();
 
 		//
-		searcher = new IndexSearcher(rd);
+		searcher = new CheckHits.ExplanationAssertingSearcher(rd);
 	}
 }
Index: src/test/org/apache/lucene/search/TestDateFilter.java
===================================================================
--- src/test/org/apache/lucene/search/TestDateFilter.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestDateFilter.java	(working copy)
@@ -61,7 +61,7 @@
  	writer.optimize();
 	writer.close();
 
-	IndexSearcher searcher = new IndexSearcher(indexStore);
+	IndexSearcher searcher = new CheckHits.ExplanationAssertingSearcher(indexStore);
 
 	// filter that should preserve matches
 	//DateFilter df1 = DateFilter.Before("datefield", now);
@@ -122,7 +122,7 @@
  	writer.optimize();
 	writer.close();
 
-	IndexSearcher searcher = new IndexSearcher(indexStore);
+	IndexSearcher searcher = new CheckHits.ExplanationAssertingSearcher(indexStore);
 
 	// filter that should preserve matches
 	//DateFilter df1 = DateFilter.After("datefield", now);
Index: src/test/org/apache/lucene/search/TestMatchAllDocsQuery.java
===================================================================
--- src/test/org/apache/lucene/search/TestMatchAllDocsQuery.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestMatchAllDocsQuery.java	(working copy)
@@ -41,7 +41,7 @@
     addDoc("three four", iw);
     iw.close();
     
-    IndexSearcher is = new IndexSearcher(dir);
+    IndexSearcher is = new CheckHits.ExplanationAssertingSearcher(dir);
     Hits hits = is.search(new MatchAllDocsQuery());
     assertEquals(3, hits.length());
 
Index: src/test/org/apache/lucene/search/TestDisjunctionMaxQuery.java
===================================================================
--- src/test/org/apache/lucene/search/TestDisjunctionMaxQuery.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestDisjunctionMaxQuery.java	(working copy)
@@ -120,7 +120,7 @@
         writer.close();
 
         r = IndexReader.open(index);
-        s = new IndexSearcher(r);
+        s = new CheckHits.ExplanationAssertingSearcher(r);
         s.setSimilarity(sim);
     }
 
Index: src/test/org/apache/lucene/search/TestSimilarity.java
===================================================================
--- src/test/org/apache/lucene/search/TestSimilarity.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestSimilarity.java	(working copy)
@@ -64,7 +64,7 @@
     writer.optimize();
     writer.close();
 
-    Searcher searcher = new IndexSearcher(store);
+    Searcher searcher = new CheckHits.ExplanationAssertingSearcher(store);
     searcher.setSimilarity(new SimpleSimilarity());
 
     Term a = new Term("field", "a");
Index: src/test/org/apache/lucene/search/TestSort.java
===================================================================
--- src/test/org/apache/lucene/search/TestSort.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestSort.java	(working copy)
@@ -134,7 +134,7 @@
 		}
 		writer.optimize ();
 		writer.close ();
-		return new IndexSearcher (indexStore);
+		return new CheckHits.ExplanationAssertingSearcher (indexStore);
 	}
 
 	private Searcher getFullIndex()
Index: src/test/org/apache/lucene/search/TestBooleanScorer.java
===================================================================
--- src/test/org/apache/lucene/search/TestBooleanScorer.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestBooleanScorer.java	(working copy)
@@ -62,7 +62,7 @@
       query.add(booleanQuery1, BooleanClause.Occur.MUST);
       query.add(new TermQuery(new Term(FIELD, "9")), BooleanClause.Occur.MUST_NOT);
 
-      IndexSearcher indexSearcher = new IndexSearcher(directory);
+      IndexSearcher indexSearcher = new CheckHits.ExplanationAssertingSearcher(directory);
       Hits hits = indexSearcher.search(query);
       assertEquals("Number of matched documents", 2, hits.length());
 
Index: src/test/org/apache/lucene/search/TestRangeFilter.java
===================================================================
--- src/test/org/apache/lucene/search/TestRangeFilter.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestRangeFilter.java	(working copy)
@@ -42,6 +42,7 @@
     public void testRangeFilterId() throws IOException {
 
         IndexReader reader = IndexReader.open(index);
+        // don't use ExplanationAssertingSearcher, result sets are huge 
 	IndexSearcher search = new IndexSearcher(reader);
 
         int medId = ((maxId - minId) / 2);
@@ -99,6 +100,9 @@
 
         // very small sets
 
+        // now we can use ExplanationAssertingSearch
+	search = new CheckHits.ExplanationAssertingSearcher(reader);
+        
 	result = search.search(q,new RangeFilter("id",minIP,minIP,F,F));
 	assertEquals("min,min,F,F", 0, result.length());
 	result = search.search(q,new RangeFilter("id",medIP,medIP,F,F));
@@ -124,6 +128,7 @@
     public void testRangeFilterRand() throws IOException {
 
         IndexReader reader = IndexReader.open(index);
+        // don't use ExplanationAssertingSearcher, result sets are huge 
 	IndexSearcher search = new IndexSearcher(reader);
 
         String minRP = pad(minR);
@@ -166,6 +171,9 @@
         
         // very small sets
 
+        // now we can use ExplanationAssertingSearch
+	search = new CheckHits.ExplanationAssertingSearcher(reader);
+        
 	result = search.search(q,new RangeFilter("rand",minRP,minRP,F,F));
 	assertEquals("min,min,F,F", 0, result.length());
 	result = search.search(q,new RangeFilter("rand",maxRP,maxRP,F,F));
Index: src/test/org/apache/lucene/search/spans/TestBasics.java
===================================================================
--- src/test/org/apache/lucene/search/spans/TestBasics.java	(revision 397330)
+++ src/test/org/apache/lucene/search/spans/TestBasics.java	(working copy)
@@ -59,7 +59,7 @@
 
     writer.close();
 
-    searcher = new IndexSearcher(directory);
+    searcher = new CheckHits.ExplanationAssertingSearcher(directory);
   }
   
   public void testTerm() throws Exception {
Index: src/test/org/apache/lucene/search/spans/TestSpans.java
===================================================================
--- src/test/org/apache/lucene/search/spans/TestSpans.java	(revision 397330)
+++ src/test/org/apache/lucene/search/spans/TestSpans.java	(working copy)
@@ -43,7 +43,7 @@
       writer.addDocument(doc);
     }
     writer.close();
-    searcher = new IndexSearcher(directory);
+    searcher = new CheckHits.ExplanationAssertingSearcher(directory);
 //System.out.println("set up " + getName());
   }
 
Index: src/test/org/apache/lucene/search/spans/TestSpansAdvanced.java
===================================================================
--- src/test/org/apache/lucene/search/spans/TestSpansAdvanced.java	(revision 397330)
+++ src/test/org/apache/lucene/search/spans/TestSpansAdvanced.java	(working copy)
@@ -60,7 +60,7 @@
         addDocument(writer, "3", "I think it should work.");
         addDocument(writer, "4", "I think it should work.");
         writer.close();
-        searcher = new IndexSearcher(mDirectory);
+        searcher = new CheckHits.ExplanationAssertingSearcher(mDirectory);
     }
 
     protected void tearDown() throws Exception {
@@ -159,4 +159,4 @@
     }
 
 
-}
\ No newline at end of file
+}
Index: src/test/org/apache/lucene/search/spans/TestSpansAdvanced2.java
===================================================================
--- src/test/org/apache/lucene/search/spans/TestSpansAdvanced2.java	(revision 397330)
+++ src/test/org/apache/lucene/search/spans/TestSpansAdvanced2.java	(working copy)
@@ -47,7 +47,7 @@
         writer.close();
 
         // re-open the searcher since we added more docs
-        searcher2 = new IndexSearcher(mDirectory);
+        searcher2 = new CheckHits.ExplanationAssertingSearcher(mDirectory);
     }
 
     /**
Index: src/test/org/apache/lucene/search/CheckHits.java
===================================================================
--- src/test/org/apache/lucene/search/CheckHits.java	(revision 397330)
+++ src/test/org/apache/lucene/search/CheckHits.java	(working copy)
@@ -16,6 +16,9 @@
  * limitations under the License.
  */
 
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.index.IndexReader;
+
 import junit.framework.TestCase;
 
 import java.io.IOException;
@@ -23,7 +26,14 @@
 import java.util.TreeSet;
 
 public class CheckHits {
-  /** Tests that a query has expected document number results.
+  
+  /**
+   * Tests that a query matches the an expected set of documents
+   *
+   * @param query the query to test
+   * @param searcher the searcher to test the query against
+   * @param defaultFieldName used for displaing the query in assertion messages
+   * @param results a list of documentIds that must match the query
    */
   public static void checkHits(
         Query query,
@@ -138,6 +148,121 @@
     return sb.toString();
   }
 
+  /**
+   * Asserts that the score explanation for every document matching a
+   * query corrisponds with the true score.
+   *
+   * @see ExplanationAsserter
+   * @param query the query to test
+   * @param searcher the searcher to test the query against
+   * @param defaultFieldName used for displaing the query in assertion messages
+   */
+  public static void checkExplanations(Query query,
+                                       String defaultFieldName,
+                                       Searcher searcher) throws IOException {
 
+    searcher.search(query,
+                    new ExplanationAsserter
+                    (query, defaultFieldName, searcher));
+
+  }
+
+  /**
+   * an IndexSearcher that implicitly checks hte explanation of every match
+   * whenever it executes a search
+   */
+  public static class ExplanationAssertingSearcher extends IndexSearcher {
+    public ExplanationAssertingSearcher(Directory d) throws IOException {
+      super(d);
+    }
+    public ExplanationAssertingSearcher(IndexReader r) throws IOException {
+      super(r);
+    }
+    protected void checkExplanations(Query q) throws IOException {
+      super.search(q, null,
+                   new ExplanationAsserter
+                   (q, null, this));
+    }
+    public Hits search(Query query, Filter filter) throws IOException {
+      checkExplanations(query);
+      return super.search(query,filter);
+    }
+    public Hits search(Query query, Sort sort) throws IOException {
+      checkExplanations(query);
+      return super.search(query,sort);
+    }
+    public Hits search(Query query, Filter filter,
+                       Sort sort) throws IOException {
+      checkExplanations(query);
+      return super.search(query,filter,sort);
+    }
+    public TopFieldDocs search(Query query,
+                               Filter filter,
+                               int n,
+                               Sort sort) throws IOException {
+      
+      checkExplanations(query);
+      return super.search(query,filter,n,sort);
+    }
+    public void search(Query query, HitCollector results) throws IOException {
+      checkExplanations(query);
+      super.search(query,results);
+    }
+    public void search(Query query, Filter filter,
+                       HitCollector results) throws IOException {
+      checkExplanations(query);
+      super.search(query,filter, results);
+    }
+    public TopDocs search(Query query, Filter filter,
+                          int n) throws IOException {
+
+      checkExplanations(query);
+      return super.search(query,filter, n);
+    }
+  }
+    
+  /**
+   * Asserts that the score explanation for every document matching a
+   * query corrisponds with the true score.
+   *
+   * NOTE: this HitCollector should only be used with the Query and Searcher
+   * specified at when it is constructed.
+   */
+  public static class ExplanationAsserter extends HitCollector {
+
+    /**
+     * Some explains methods calculate their vlaues though a slightly
+     * differnet  order of operations from the acctaul scoring method ...
+     * this allows for a small amount of variation
+     */
+    public static float SCORE_TOLERANCE_DELTA = 0.00005f;
+    
+    Query q;
+    Searcher s;
+    String d;
+    public ExplanationAsserter(Query q, String defaultFieldName, Searcher s) {
+      this.q=q;
+      this.s=s;
+      this.d = q.toString(defaultFieldName);
+    }      
+    public void collect(int doc, float score) {
+      Explanation exp = null;
+      
+      try {
+        exp = s.explain(q, doc);
+      } catch (IOException e) {
+        throw new RuntimeException
+          ("exception in hitcollector of [["+d+"]] for #"+doc, e);
+      }
+      
+      TestCase.assertNotNull("Explanation of [["+d+"]] for #"+doc+" is null",
+                             exp);
+      TestCase.assertEquals("Score of [["+d+"]] for #"+doc+
+                            " does not match explanation: " + exp.toString(),
+                            score, exp.getValue(), SCORE_TOLERANCE_DELTA);
+    }
+    
+  }
+
 }
 
Index: src/test/org/apache/lucene/search/TestMultiSearcher.java
===================================================================
--- src/test/org/apache/lucene/search/TestMultiSearcher.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestMultiSearcher.java	(working copy)
@@ -105,8 +105,8 @@
         // building the searchables
         Searcher[] searchers = new Searcher[2];
         // VITAL STEP:adding the searcher for the empty index first, before the searcher for the populated index
-        searchers[0] = new IndexSearcher(indexStoreB);
-        searchers[1] = new IndexSearcher(indexStoreA);
+        searchers[0] = new CheckHits.ExplanationAssertingSearcher(indexStoreB);
+        searchers[1] = new CheckHits.ExplanationAssertingSearcher(indexStoreA);
         // creating the multiSearcher
         Searcher mSearcher = getMultiSearcherInstance(searchers);
         // performing the search
@@ -134,8 +134,8 @@
         // building the searchables
         Searcher[] searchers2 = new Searcher[2];
         // VITAL STEP:adding the searcher for the empty index first, before the searcher for the populated index
-        searchers2[0] = new IndexSearcher(indexStoreB);
-        searchers2[1] = new IndexSearcher(indexStoreA);
+        searchers2[0] = new CheckHits.ExplanationAssertingSearcher(indexStoreB);
+        searchers2[1] = new CheckHits.ExplanationAssertingSearcher(indexStoreA);
         // creating the mulitSearcher
         Searcher mSearcher2 = getMultiSearcherInstance(searchers2);
         // performing the same search
@@ -168,8 +168,8 @@
         // building the searchables
         Searcher[] searchers3 = new Searcher[2];
 
-        searchers3[0] = new IndexSearcher(indexStoreB);
-        searchers3[1] = new IndexSearcher(indexStoreA);
+        searchers3[0] = new CheckHits.ExplanationAssertingSearcher(indexStoreB);
+        searchers3[1] = new CheckHits.ExplanationAssertingSearcher(indexStoreA);
         // creating the mulitSearcher
         Searcher mSearcher3 = getMultiSearcherInstance(searchers3);
         // performing the same search
@@ -235,7 +235,7 @@
         initIndex(ramDirectory1, nDocs, true, null); // documents with a single token "doc0", "doc1", etc...
         initIndex(ramDirectory1, nDocs, false, "x"); // documents with two tokens "doc0" and "x", "doc1" and x, etc...
         
-        indexSearcher1=new IndexSearcher(ramDirectory1);
+        indexSearcher1=new CheckHits.ExplanationAssertingSearcher(ramDirectory1);
         
         hits=indexSearcher1.search(query);
         
@@ -264,8 +264,8 @@
         initIndex(ramDirectory1, nDocs, true, null); // documents with a single token "doc0", "doc1", etc...
         initIndex(ramDirectory2, nDocs, true, "x"); // documents with two tokens "doc0" and "x", "doc1" and x, etc...
         
-        indexSearcher1=new IndexSearcher(ramDirectory1);
-        indexSearcher2=new IndexSearcher(ramDirectory2);
+        indexSearcher1=new CheckHits.ExplanationAssertingSearcher(ramDirectory1);
+        indexSearcher2=new CheckHits.ExplanationAssertingSearcher(ramDirectory2);
         
         Searcher searcher=getMultiSearcherInstance(new Searcher[] { indexSearcher1, indexSearcher2 });
         
Index: src/test/org/apache/lucene/search/TestDocBoost.java
===================================================================
--- src/test/org/apache/lucene/search/TestDocBoost.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestDocBoost.java	(working copy)
@@ -65,7 +65,7 @@
 
     final float[] scores = new float[4];
 
-    new IndexSearcher(store).search
+    new CheckHits.ExplanationAssertingSearcher(store).search
       (new TermQuery(new Term("field", "word")),
        new HitCollector() {
          public final void collect(int doc, float score) {
Index: src/test/org/apache/lucene/search/TestTermVectors.java
===================================================================
--- src/test/org/apache/lucene/search/TestTermVectors.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestTermVectors.java	(working copy)
@@ -63,7 +63,7 @@
       writer.addDocument(doc);
     }
     writer.close();
-    searcher = new IndexSearcher(directory);
+    searcher = new CheckHits.ExplanationAssertingSearcher(directory);
   }
 
   protected void tearDown() {
@@ -208,7 +208,7 @@
       writer.addDocument(testDoc3);
       writer.addDocument(testDoc4);
       writer.close();
-      IndexSearcher knownSearcher = new IndexSearcher(dir);
+      IndexSearcher knownSearcher = new CheckHits.ExplanationAssertingSearcher(dir);
       TermEnum termEnum = knownSearcher.reader.terms();
       TermDocs termDocs = knownSearcher.reader.termDocs();
       //System.out.println("Terms: " + termEnum.size() + " Orig Len: " + termArray.length);
Index: src/test/org/apache/lucene/search/TestMultiSearcherRanking.java
===================================================================
--- src/test/org/apache/lucene/search/TestMultiSearcherRanking.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestMultiSearcherRanking.java	(working copy)
@@ -121,8 +121,8 @@
     iw2.close();
 
     Searchable[] s = new Searchable[2];
-    s[0] = new IndexSearcher(d1);
-    s[1] = new IndexSearcher(d2);
+    s[0] = new CheckHits.ExplanationAssertingSearcher(d1);
+    s[1] = new CheckHits.ExplanationAssertingSearcher(d2);
     multiSearcher = new MultiSearcher(s);
 
     // create IndexSearcher which contains all documents
@@ -131,7 +131,7 @@
     addCollection1(iw);
     addCollection2(iw);
     iw.close();
-    singleSearcher = new IndexSearcher(d);
+    singleSearcher = new CheckHits.ExplanationAssertingSearcher(d);
   }
   
   private void addCollection1(IndexWriter iw) throws IOException {
Index: src/test/org/apache/lucene/search/TestRangeQuery.java
===================================================================
--- src/test/org/apache/lucene/search/TestRangeQuery.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestRangeQuery.java	(working copy)
@@ -27,19 +27,19 @@
                                  new Term("content", "C"),
                                  false);
     initializeIndex(new String[] {"A", "B", "C", "D"});
-    IndexSearcher searcher = new IndexSearcher(dir);
+    IndexSearcher searcher = new CheckHits.ExplanationAssertingSearcher(dir);
     Hits hits = searcher.search(query);
     assertEquals("A,B,C,D, only B in range", 1, hits.length());
     searcher.close();
 
     initializeIndex(new String[] {"A", "B", "D"});
-    searcher = new IndexSearcher(dir);
+    searcher = new CheckHits.ExplanationAssertingSearcher(dir);
     hits = searcher.search(query);
     assertEquals("A,B,D, only B in range", 1, hits.length());
     searcher.close();
 
     addDoc("C");
-    searcher = new IndexSearcher(dir);
+    searcher = new CheckHits.ExplanationAssertingSearcher(dir);
     hits = searcher.search(query);
     assertEquals("C added, still only B in range", 1, hits.length());
     searcher.close();
@@ -51,19 +51,19 @@
                                  true);
 
     initializeIndex(new String[]{"A", "B", "C", "D"});
-    IndexSearcher searcher = new IndexSearcher(dir);
+    IndexSearcher searcher = new CheckHits.ExplanationAssertingSearcher(dir);
     Hits hits = searcher.search(query);
     assertEquals("A,B,C,D - A,B,C in range", 3, hits.length());
     searcher.close();
 
     initializeIndex(new String[]{"A", "B", "D"});
-    searcher = new IndexSearcher(dir);
+    searcher = new CheckHits.ExplanationAssertingSearcher(dir);
     hits = searcher.search(query);
     assertEquals("A,B,D - A and B in range", 2, hits.length());
     searcher.close();
 
     addDoc("C");
-    searcher = new IndexSearcher(dir);
+    searcher = new CheckHits.ExplanationAssertingSearcher(dir);
     hits = searcher.search(query);
     assertEquals("C added - A, B, C in range", 3, hits.length());
     searcher.close();
Index: src/test/org/apache/lucene/search/TestPrefixQuery.java
===================================================================
--- src/test/org/apache/lucene/search/TestPrefixQuery.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestPrefixQuery.java	(working copy)
@@ -45,7 +45,7 @@
     writer.close();
 
     PrefixQuery query = new PrefixQuery(new Term("category", "/Computers"));
-    IndexSearcher searcher = new IndexSearcher(directory);
+    IndexSearcher searcher = new CheckHits.ExplanationAssertingSearcher(directory);
     Hits hits = searcher.search(query);
     assertEquals("All documents in /Computers category and below", 3, hits.length());
 
Index: src/test/org/apache/lucene/search/TestMultiPhraseQuery.java
===================================================================
--- src/test/org/apache/lucene/search/TestMultiPhraseQuery.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestMultiPhraseQuery.java	(working copy)
@@ -57,7 +57,7 @@
         writer.optimize();
         writer.close();
 
-        IndexSearcher searcher = new IndexSearcher(indexStore);
+        IndexSearcher searcher = new CheckHits.ExplanationAssertingSearcher(indexStore);
 
         // search for "blueberry pi*":
         MultiPhraseQuery query1 = new MultiPhraseQuery();
@@ -147,7 +147,7 @@
       writer.optimize();
       writer.close();
 
-      IndexSearcher searcher = new IndexSearcher(indexStore);
+      IndexSearcher searcher = new CheckHits.ExplanationAssertingSearcher(indexStore);
       // This query will be equivalent to +body:pie +body:"blue*"
       BooleanQuery q = new BooleanQuery();
       q.add(new TermQuery(new Term("body", "pie")), BooleanClause.Occur.MUST);
@@ -173,7 +173,7 @@
     add("a note", "note", writer);
     writer.close();
     
-    IndexSearcher searcher = new IndexSearcher(indexStore);
+    IndexSearcher searcher = new CheckHits.ExplanationAssertingSearcher(indexStore);
 
     // This query will be equivalent to +type:note +body:"a t*"
     BooleanQuery q = new BooleanQuery();
Index: src/test/org/apache/lucene/search/TestFilteredQuery.java
===================================================================
--- src/test/org/apache/lucene/search/TestFilteredQuery.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestFilteredQuery.java	(working copy)
@@ -71,7 +71,7 @@
     writer.optimize ();
     writer.close ();
 
-    searcher = new IndexSearcher (directory);
+    searcher = new CheckHits.ExplanationAssertingSearcher (directory);
     query = new TermQuery (new Term ("field", "three"));
     filter = new Filter() {
       public BitSet bits (IndexReader reader) {
Index: src/test/org/apache/lucene/search/TestPhrasePrefixQuery.java
===================================================================
--- src/test/org/apache/lucene/search/TestPhrasePrefixQuery.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestPhrasePrefixQuery.java	(working copy)
@@ -69,7 +69,7 @@
         writer.optimize();
         writer.close();
 
-        IndexSearcher searcher = new IndexSearcher(indexStore);
+        IndexSearcher searcher = new CheckHits.ExplanationAssertingSearcher(indexStore);
 
         //PhrasePrefixQuery query1 = new PhrasePrefixQuery();
         MultiPhraseQuery query1 = new MultiPhraseQuery();
Index: src/test/org/apache/lucene/search/TestSetNorm.java
===================================================================
--- src/test/org/apache/lucene/search/TestSetNorm.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestSetNorm.java	(working copy)
@@ -62,7 +62,7 @@
     // check that searches are ordered by this boost
     final float[] scores = new float[4];
 
-    new IndexSearcher(store).search
+    new CheckHits.ExplanationAssertingSearcher(store).search
       (new TermQuery(new Term("field", "word")),
        new HitCollector() {
          public final void collect(int doc, float score) {
Index: src/test/org/apache/lucene/search/TestConstantScoreRangeQuery.java
===================================================================
--- src/test/org/apache/lucene/search/TestConstantScoreRangeQuery.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestConstantScoreRangeQuery.java	(working copy)
@@ -96,7 +96,7 @@
         // NOTE: uses index build in *this* setUp
         
         IndexReader reader = IndexReader.open(small);
-	IndexSearcher search = new IndexSearcher(reader);
+	IndexSearcher search = new CheckHits.ExplanationAssertingSearcher(reader);
 
 	Hits result;
 
@@ -117,7 +117,7 @@
         // NOTE: uses index build in *this* setUp
 
         IndexReader reader = IndexReader.open(small);
-	IndexSearcher search = new IndexSearcher(reader);
+	IndexSearcher search = new CheckHits.ExplanationAssertingSearcher(reader);
 
       // test for correct application of query normalization
       // must use a non score normalizing method for this.
@@ -165,7 +165,7 @@
         // NOTE: uses index build in *this* setUp
         
         IndexReader reader = IndexReader.open(small);
-	IndexSearcher search = new IndexSearcher(reader);
+	IndexSearcher search = new CheckHits.ExplanationAssertingSearcher(reader);
 
         // first do a regular RangeQuery which uses term expansion so
         // docs with more terms in range get higher scores
@@ -200,6 +200,7 @@
         // NOTE: uses index build in *super* setUp
 
         IndexReader reader = IndexReader.open(index);
+        // don't use ExplanationAssertingSearcher, result sets are huge 
 	IndexSearcher search = new IndexSearcher(reader);
 
         int medId = ((maxId - minId) / 2);
@@ -256,6 +257,9 @@
 
         // very small sets
 
+        // now we can use ExplanationAssertingSearch
+	search = new CheckHits.ExplanationAssertingSearcher(reader);
+        
 	result = search.search(csrq("id",minIP,minIP,F,F));
 	assertEquals("min,min,F,F", 0, result.length());
 	result = search.search(csrq("id",medIP,medIP,F,F));
@@ -282,6 +286,7 @@
         // NOTE: uses index build in *super* setUp
 
         IndexReader reader = IndexReader.open(index);
+        // don't use ExplanationAssertingSearcher, result sets are huge 
 	IndexSearcher search = new IndexSearcher(reader);
 
         String minRP = pad(minR);
@@ -324,6 +329,9 @@
         
         // very small sets
 
+        // now we can use ExplanationAssertingSearch
+	search = new CheckHits.ExplanationAssertingSearcher(reader);
+        
 	result = search.search(csrq("rand",minRP,minRP,F,F));
 	assertEquals("min,min,F,F", 0, result.length());
 	result = search.search(csrq("rand",maxRP,maxRP,F,F));
Index: src/test/org/apache/lucene/search/TestWildcard.java
===================================================================
--- src/test/org/apache/lucene/search/TestWildcard.java	(revision 397330)
+++ src/test/org/apache/lucene/search/TestWildcard.java	(working copy)
@@ -61,7 +61,7 @@
       throws IOException {
     RAMDirectory indexStore = getIndexStore("body", new String[]
     {"metal", "metals"});
-    IndexSearcher searcher = new IndexSearcher(indexStore);
+    IndexSearcher searcher = new CheckHits.ExplanationAssertingSearcher(indexStore);
     Query query1 = new TermQuery(new Term("body", "metal"));
     Query query2 = new WildcardQuery(new Term("body", "metal*"));
     Query query3 = new WildcardQuery(new Term("body", "m*tal"));
@@ -100,7 +100,7 @@
       throws IOException {
     RAMDirectory indexStore = getIndexStore("body", new String[]
     {"metal", "metals", "mXtals", "mXtXls"});
-    IndexSearcher searcher = new IndexSearcher(indexStore);
+    IndexSearcher searcher = new CheckHits.ExplanationAssertingSearcher(indexStore);
     Query query1 = new WildcardQuery(new Term("body", "m?tal"));
     Query query2 = new WildcardQuery(new Term("body", "metal?"));
     Query query3 = new WildcardQuery(new Term("body", "metals?"));
Index: src/test/org/apache/lucene/index/store/TestRAMDirectory.java
===================================================================
--- src/test/org/apache/lucene/index/store/TestRAMDirectory.java	(revision 397330)
+++ src/test/org/apache/lucene/index/store/TestRAMDirectory.java	(working copy)
@@ -26,6 +26,7 @@
 import org.apache.lucene.document.Field;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.search.CheckHits;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.FSDirectory;
@@ -80,7 +81,7 @@
     assertEquals(docsToAdd, reader.numDocs());
     
     // open search zo check if all doc's are there
-    IndexSearcher searcher = new IndexSearcher(reader);
+    IndexSearcher searcher = new CheckHits.ExplanationAssertingSearcher(reader);
     
     // search for all documents
     for (int i = 0; i < docsToAdd; i++) {
@@ -102,7 +103,7 @@
     assertEquals(docsToAdd, reader.numDocs());
     
     // open search zo check if all doc's are there
-    IndexSearcher searcher = new IndexSearcher(reader);
+    IndexSearcher searcher = new CheckHits.ExplanationAssertingSearcher(reader);
     
     // search for all documents
     for (int i = 0; i < docsToAdd; i++) {
@@ -124,7 +125,7 @@
     assertEquals(docsToAdd, reader.numDocs());
     
     // open search zo check if all doc's are there
-    IndexSearcher searcher = new IndexSearcher(reader);
+    IndexSearcher searcher = new CheckHits.ExplanationAssertingSearcher(reader);
     
     // search for all documents
     for (int i = 0; i < docsToAdd; i++) {
Index: src/test/org/apache/lucene/index/TestParallelReader.java
===================================================================
--- src/test/org/apache/lucene/index/TestParallelReader.java	(revision 397330)
+++ src/test/org/apache/lucene/index/TestParallelReader.java	(working copy)
@@ -126,7 +126,7 @@
     w.addDocument(d2);
     w.close();
 
-    return new IndexSearcher(dir);
+    return new CheckHits.ExplanationAssertingSearcher(dir);
   }
 
   // Fields 1 & 2 in one index, 3 & 4 in other, with ParallelReader:
@@ -136,7 +136,7 @@
     ParallelReader pr = new ParallelReader();
     pr.add(IndexReader.open(dir1));
     pr.add(IndexReader.open(dir2));
-    return new IndexSearcher(pr);
+    return new CheckHits.ExplanationAssertingSearcher(pr);
   }
 
   private Directory getDir1() throws IOException {
Index: src/test/org/apache/lucene/SearchTestForDuplicates.java
===================================================================
--- src/test/org/apache/lucene/SearchTestForDuplicates.java	(revision 397330)
+++ src/test/org/apache/lucene/SearchTestForDuplicates.java	(working copy)
@@ -50,7 +50,7 @@
       writer.close();
 
       // try a search without OR
-      Searcher searcher = new IndexSearcher(directory);
+      Searcher searcher = new CheckHits.ExplanationAssertingSearcher(directory);
       Hits hits = null;
 
       QueryParser parser = new QueryParser(PRIORITY_FIELD, analyzer);
@@ -64,7 +64,7 @@
       searcher.close();
 
       // try a new search with OR
-      searcher = new IndexSearcher(directory);
+      searcher = new CheckHits.ExplanationAssertingSearcher(directory);
       hits = null;
 
       parser = new QueryParser(PRIORITY_FIELD, analyzer);
Index: src/test/org/apache/lucene/TestSearchForDuplicates.java
===================================================================
--- src/test/org/apache/lucene/TestSearchForDuplicates.java	(revision 397330)
+++ src/test/org/apache/lucene/TestSearchForDuplicates.java	(working copy)
@@ -98,7 +98,7 @@
       writer.close();
 
       // try a search without OR
-      Searcher searcher = new IndexSearcher(directory);
+      Searcher searcher = new CheckHits.ExplanationAssertingSearcher(directory);
       Hits hits = null;
 
       QueryParser parser = new QueryParser(PRIORITY_FIELD, analyzer);
@@ -113,7 +113,7 @@
       searcher.close();
 
       // try a new search with OR
-      searcher = new IndexSearcher(directory);
+      searcher = new CheckHits.ExplanationAssertingSearcher(directory);
       hits = null;
 
       parser = new QueryParser(PRIORITY_FIELD, analyzer);
Index: src/test/org/apache/lucene/document/TestDocument.java
===================================================================
--- src/test/org/apache/lucene/document/TestDocument.java	(revision 397330)
+++ src/test/org/apache/lucene/document/TestDocument.java	(working copy)
@@ -12,6 +12,7 @@
 import org.apache.lucene.search.TermQuery;
 import org.apache.lucene.search.IndexSearcher;
 import org.apache.lucene.search.Searcher;
+import org.apache.lucene.search.CheckHits;
 import org.apache.lucene.search.Hits;
 
 /**
@@ -163,7 +164,7 @@
         writer.addDocument(makeDocumentWithFields());
         writer.close();
 
-        Searcher searcher = new IndexSearcher(dir);
+        Searcher searcher = new CheckHits.ExplanationAssertingSearcher(dir);
 
 	// search for something that does exists
 	Query query = new TermQuery(new Term("keyword", "test1"));
