Index: src/java/org/apache/lucene/search/MultiSearcher.java =================================================================== --- src/java/org/apache/lucene/search/MultiSearcher.java (revision 4491) +++ src/java/org/apache/lucene/search/MultiSearcher.java (working copy) @@ -311,6 +311,16 @@ rewrittenQuery.extractTerms(terms); // step3 + final HashMap dfMap = createDfMap(terms); + + // step4 + final int numDocs = maxDoc(); + final CachedDfSource cacheSim = new CachedDfSource(dfMap, numDocs, getSimilarity()); + + return rewrittenQuery.weight(cacheSim); + } + + protected HashMap createDfMap(Set terms) throws IOException { final Term[] allTermsArray = new Term[terms.size()]; terms.toArray(allTermsArray); int[] aggregatedDfs = new int[terms.size()]; @@ -325,12 +335,7 @@ for(int i=0; i createDfMap(Set terms) throws IOException { + final Term[] allTermsArray = new Term[terms.size()]; + terms.toArray(allTermsArray); + final int[] aggregatedDfs = new int[terms.size()]; + + @SuppressWarnings("unchecked") final Future[] searchThreads = new Future[searchables.length]; + for (int i = 0; i < searchables.length; i++) { + final Searchable searchable = searchables[i]; + searchThreads[i] = executor.submit(new Callable() { + public int[] call() throws IOException { + return searchable.docFreqs(allTermsArray); + } + }); + } + foreach( + new Function() { + public void apply(int[] dfs) { + for(int j=0; j dfMap = new HashMap(); + for(int i=0; i