You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ab...@apache.org on 2018/07/19 08:41:46 UTC

[45/50] [abbrv] lucene-solr:jira/solr-12509: LUCENE-8405: Remove TopDocs.maxScore.

LUCENE-8405: Remove TopDocs.maxScore.


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/331ccf39
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/331ccf39
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/331ccf39

Branch: refs/heads/jira/solr-12509
Commit: 331ccf391067b7775db371bec1ec8e8c9004e904
Parents: 1ba5cff
Author: Adrien Grand <jp...@gmail.com>
Authored: Wed Jul 18 08:31:44 2018 +0200
Committer: Adrien Grand <jp...@gmail.com>
Committed: Wed Jul 18 08:38:57 2018 +0200

----------------------------------------------------------------------
 lucene/CHANGES.txt                              |   4 +
 lucene/MIGRATE.txt                              |  14 ++
 .../lucene/benchmark/byTask/tasks/ReadTask.java |   7 -
 .../byTask/tasks/SearchWithSortTask.java        |   9 --
 .../lucene/classification/BM25NBClassifier.java |   4 +-
 .../classification/KNearestFuzzyClassifier.java |   2 +-
 .../KNearestNeighborClassifier.java             |   2 +-
 .../org/apache/lucene/search/IndexSearcher.java |  16 +-
 .../org/apache/lucene/search/QueryRescorer.java |   2 +-
 .../org/apache/lucene/search/SortRescorer.java  |   2 +-
 .../java/org/apache/lucene/search/TopDocs.java  |  35 +----
 .../apache/lucene/search/TopDocsCollector.java  |   2 +-
 .../apache/lucene/search/TopFieldCollector.java |  81 ++--------
 .../org/apache/lucene/search/TopFieldDocs.java  |   5 +-
 .../lucene/search/TopScoreDocCollector.java     |  16 +-
 .../apache/lucene/index/TestIndexSorting.java   |   5 +-
 .../org/apache/lucene/search/TestBoolean2.java  |   8 +-
 .../lucene/search/TestDoubleValuesSource.java   |   4 +-
 .../lucene/search/TestElevationComparator.java  |   2 +-
 .../apache/lucene/search/TestIndexSearcher.java |  12 +-
 .../lucene/search/TestLongValuesSource.java     |   4 +-
 .../apache/lucene/search/TestSearchAfter.java   |   9 +-
 .../lucene/search/TestShardSearching.java       |   4 +-
 .../apache/lucene/search/TestSortRandom.java    |   2 +-
 .../search/TestSortedNumericSortField.java      |   4 +-
 .../lucene/search/TestSortedSetSortField.java   |   4 +-
 .../lucene/search/TestTopDocsCollector.java     |  22 +--
 .../apache/lucene/search/TestTopDocsMerge.java  |  10 +-
 .../lucene/search/TestTopFieldCollector.java    | 155 +++++++------------
 .../TestTopFieldCollectorEarlyTermination.java  |   7 +-
 .../lucene/expressions/TestDemoExpressions.java |  10 +-
 .../lucene/expressions/TestExpressionSorts.java |   4 +-
 .../org/apache/lucene/facet/DrillSideways.java  |   6 +-
 .../apache/lucene/facet/FacetsCollector.java    |  21 ++-
 .../apache/lucene/facet/TestDrillSideways.java  |   5 +-
 .../TestTaxonomyFacetSumValueSource.java        |   2 +-
 .../search/grouping/BlockGroupingCollector.java |   8 +-
 .../lucene/search/grouping/TopGroups.java       |   6 +-
 .../search/grouping/TopGroupsCollector.java     |  93 +++++++++--
 .../TestUnifiedHighlighterStrictPhrases.java    |   2 +-
 .../lucene/search/join/TestBlockJoin.java       |   2 +-
 .../apache/lucene/search/join/TestJoinUtil.java |   3 +-
 .../join/TestParentChildrenBlockJoinQuery.java  |   1 -
 .../search/DiversifiedTopDocsCollector.java     |  16 +-
 .../function/TestIndexReaderFunctions.java      |   2 +-
 .../queries/function/TestValueSources.java      |   2 +-
 .../queries/payloads/TestPayloadTermQuery.java  |   2 -
 .../document/FloatPointNearestNeighbor.java     |   2 +-
 .../org/apache/lucene/document/LatLonPoint.java |   2 +-
 .../analyzing/AnalyzingInfixSuggester.java      |   2 +-
 .../search/suggest/document/TopSuggestDocs.java |   8 +-
 .../document/TopSuggestDocsCollector.java       |   2 +-
 .../java/org/apache/lucene/util/TestUtil.java   |   1 -
 .../java/org/apache/solr/ltr/LTRRescorer.java   |   2 +-
 .../solr/ltr/TestLTRReRankingPipeline.java      |   2 +-
 .../solr/handler/component/ExpandComponent.java |   6 +-
 .../apache/solr/search/ExportQParserPlugin.java |   2 +-
 .../java/org/apache/solr/search/Grouping.java   |  33 ++--
 .../apache/solr/search/MaxScoreCollector.java   |  55 +++++++
 .../org/apache/solr/search/ReRankCollector.java |   5 +-
 .../apache/solr/search/SolrIndexSearcher.java   |  21 ++-
 .../distributed/command/QueryCommand.java       |  26 +++-
 .../distributed/command/QueryCommandResult.java |   8 +-
 .../TopGroupsShardResponseProcessor.java        |  14 +-
 .../TopGroupsResultTransformer.java             |  10 +-
 .../GroupedEndResultTransformer.java            |   4 +-
 .../apache/solr/search/TestRankQueryPlugin.java |   4 +-
 .../test/org/apache/solr/search/TestSort.java   |   3 +-
 .../solr/uninverting/TestFieldCacheSort.java    |  20 +--
 .../uninverting/TestFieldCacheSortRandom.java   |   4 +-
 70 files changed, 436 insertions(+), 438 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/CHANGES.txt
----------------------------------------------------------------------
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index 423a005..fe1d166 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -56,6 +56,10 @@ API Changes
 * LUCENE-8388: Unused PostingsEnum#attributes() method has been removed 
   (Alan Woodward)
 
+* LUCENE-8405: TopDocs.maxScore is removed. IndexSearcher and TopFieldCollector
+  no longer have an option to compute the maximum score when sorting by field.
+  (Adrien Grand)
+
 Changes in Runtime Behavior
 
 * LUCENE-8333: Switch MoreLikeThis.setMaxDocFreqPct to use maxDoc instead of

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/MIGRATE.txt
----------------------------------------------------------------------
diff --git a/lucene/MIGRATE.txt b/lucene/MIGRATE.txt
index cc356eb..8467d72 100644
--- a/lucene/MIGRATE.txt
+++ b/lucene/MIGRATE.txt
@@ -62,3 +62,17 @@ to the constructor
 
 English stop words are now defined in EnglishAnalyzer#ENGLISH_STOP_WORD_SET in the
 analysis-common module
+
+## TopDocs.maxScore removed ##
+
+TopDocs.maxScore is removed. IndexSearcher and TopFieldCollector no longer have
+an option to compute the maximum score when sorting by field. If you need to
+know the maximum score for a query, the recommended approach is to run a
+separate query:
+
+  TopDocs topHits = searcher.search(query, 1);
+  float maxScore = topHits.scoreDocs.length == 0 ? Float.NaN : topHits.scoreDocs[0].score;
+
+Thanks to other optimizations that were added to Lucene 8, this query will be
+able to efficiently select the top-scoring document without having to visit
+all matches.

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/ReadTask.java
----------------------------------------------------------------------
diff --git a/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/ReadTask.java b/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/ReadTask.java
index a3b90f5..f587357 100644
--- a/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/ReadTask.java
+++ b/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/ReadTask.java
@@ -113,7 +113,6 @@ public abstract class ReadTask extends PerfTask {
             // pulling the Weight ourselves:
             TopFieldCollector collector = TopFieldCollector.create(sort, numHits,
                                                                    true, withScore(),
-                                                                   withMaxScore(),
                                                                    withTotalHits());
             searcher.search(q, collector);
             hits = collector.topDocs();
@@ -215,12 +214,6 @@ public abstract class ReadTask extends PerfTask {
     return true;
   }
 
-  /** Whether maxScores should be computed (only useful with
-   *  field sort) */
-  public boolean withMaxScore() {
-    return true;
-  }
-
   /** Whether totalHits should be computed (only useful with
    *  field sort) */
   public boolean withTotalHits() {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/SearchWithSortTask.java
----------------------------------------------------------------------
diff --git a/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/SearchWithSortTask.java b/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/SearchWithSortTask.java
index 8361ab3..6a17714 100644
--- a/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/SearchWithSortTask.java
+++ b/lucene/benchmark/src/java/org/apache/lucene/benchmark/byTask/tasks/SearchWithSortTask.java
@@ -30,7 +30,6 @@ import org.apache.lucene.search.SortField;
 public class SearchWithSortTask extends ReadTask {
 
   private boolean doScore = true;
-  private boolean doMaxScore = true;
   private Sort sort;
 
   public SearchWithSortTask(PerfRunData runData) {
@@ -64,9 +63,6 @@ public class SearchWithSortTask extends ReadTask {
       } else if (field.equals("noscore")) {
         doScore = false;
         continue;
-      } else if (field.equals("nomaxscore")) {
-        doMaxScore = false;
-        continue;
       } else {
         int index = field.lastIndexOf(":");
         String fieldName;
@@ -124,11 +120,6 @@ public class SearchWithSortTask extends ReadTask {
   public boolean withScore() {
     return doScore;
   }
-
-  @Override
-  public boolean withMaxScore() {
-    return doMaxScore;
-  }
   
   @Override
   public Sort getSort() {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/classification/src/java/org/apache/lucene/classification/BM25NBClassifier.java
----------------------------------------------------------------------
diff --git a/lucene/classification/src/java/org/apache/lucene/classification/BM25NBClassifier.java b/lucene/classification/src/java/org/apache/lucene/classification/BM25NBClassifier.java
index f03fc53..0613856 100644
--- a/lucene/classification/src/java/org/apache/lucene/classification/BM25NBClassifier.java
+++ b/lucene/classification/src/java/org/apache/lucene/classification/BM25NBClassifier.java
@@ -217,7 +217,7 @@ public class BM25NBClassifier implements Classifier<BytesRef> {
       builder.add(query, BooleanClause.Occur.MUST);
     }
     TopDocs search = indexSearcher.search(builder.build(), 1);
-    return search.totalHits > 0 ? search.getMaxScore() : 1;
+    return search.totalHits > 0 ? search.scoreDocs[0].score : 1;
   }
 
   private double calculateLogPrior(Term term) throws IOException {
@@ -228,7 +228,7 @@ public class BM25NBClassifier implements Classifier<BytesRef> {
       bq.add(query, BooleanClause.Occur.MUST);
     }
     TopDocs topDocs = indexSearcher.search(bq.build(), 1);
-    return topDocs.totalHits > 0 ? Math.log(topDocs.getMaxScore()) : 0;
+    return topDocs.totalHits > 0 ? Math.log(topDocs.scoreDocs[0].score) : 0;
   }
 
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/classification/src/java/org/apache/lucene/classification/KNearestFuzzyClassifier.java
----------------------------------------------------------------------
diff --git a/lucene/classification/src/java/org/apache/lucene/classification/KNearestFuzzyClassifier.java b/lucene/classification/src/java/org/apache/lucene/classification/KNearestFuzzyClassifier.java
index 941d881..0e90ccd 100644
--- a/lucene/classification/src/java/org/apache/lucene/classification/KNearestFuzzyClassifier.java
+++ b/lucene/classification/src/java/org/apache/lucene/classification/KNearestFuzzyClassifier.java
@@ -159,7 +159,7 @@ public class KNearestFuzzyClassifier implements Classifier<BytesRef> {
   private List<ClassificationResult<BytesRef>> buildListFromTopDocs(TopDocs topDocs) throws IOException {
     Map<BytesRef, Integer> classCounts = new HashMap<>();
     Map<BytesRef, Double> classBoosts = new HashMap<>(); // this is a boost based on class ranking positions in topDocs
-    float maxScore = topDocs.getMaxScore();
+    float maxScore = topDocs.totalHits == 0 ? Float.NaN : topDocs.scoreDocs[0].score;
     for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
       IndexableField storableField = indexSearcher.doc(scoreDoc.doc).getField(classFieldName);
       if (storableField != null) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/classification/src/java/org/apache/lucene/classification/KNearestNeighborClassifier.java
----------------------------------------------------------------------
diff --git a/lucene/classification/src/java/org/apache/lucene/classification/KNearestNeighborClassifier.java b/lucene/classification/src/java/org/apache/lucene/classification/KNearestNeighborClassifier.java
index 1bc53b0..6c55493 100644
--- a/lucene/classification/src/java/org/apache/lucene/classification/KNearestNeighborClassifier.java
+++ b/lucene/classification/src/java/org/apache/lucene/classification/KNearestNeighborClassifier.java
@@ -190,7 +190,7 @@ public class KNearestNeighborClassifier implements Classifier<BytesRef> {
   protected List<ClassificationResult<BytesRef>> buildListFromTopDocs(TopDocs topDocs) throws IOException {
     Map<BytesRef, Integer> classCounts = new HashMap<>();
     Map<BytesRef, Double> classBoosts = new HashMap<>(); // this is a boost based on class ranking positions in topDocs
-    float maxScore = topDocs.getMaxScore();
+    float maxScore = topDocs.totalHits == 0 ? Float.NaN : topDocs.scoreDocs[0].score;
     for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
       IndexableField[] storableFields = indexSearcher.doc(scoreDoc.doc).getFields(classFieldName);
       for (IndexableField singleStorableField : storableFields) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java b/lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java
index 85a0006..64f61c0 100644
--- a/lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java
+++ b/lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java
@@ -441,8 +441,8 @@ public class IndexSearcher {
    *         {@link BooleanQuery#getMaxClauseCount()} clauses.
    */
   public TopFieldDocs search(Query query, int n,
-      Sort sort, boolean doDocScores, boolean doMaxScore) throws IOException {
-    return searchAfter(null, query, n, sort, doDocScores, doMaxScore);
+      Sort sort, boolean doDocScores) throws IOException {
+    return searchAfter(null, query, n, sort, doDocScores);
   }
 
   /**
@@ -454,7 +454,7 @@ public class IndexSearcher {
    * @throws IOException if there is a low-level I/O error
    */
   public TopFieldDocs search(Query query, int n, Sort sort) throws IOException {
-    return searchAfter(null, query, n, sort, false, false);
+    return searchAfter(null, query, n, sort, false);
   }
 
   /** Finds the top <code>n</code>
@@ -469,7 +469,7 @@ public class IndexSearcher {
    *         {@link BooleanQuery#getMaxClauseCount()} clauses.
    */
   public TopDocs searchAfter(ScoreDoc after, Query query, int n, Sort sort) throws IOException {
-    return searchAfter(after, query, n, sort, false, false);
+    return searchAfter(after, query, n, sort, false);
   }
 
   /** Finds the top <code>n</code>
@@ -489,17 +489,17 @@ public class IndexSearcher {
    *         {@link BooleanQuery#getMaxClauseCount()} clauses.
    */
   public TopFieldDocs searchAfter(ScoreDoc after, Query query, int numHits, Sort sort,
-      boolean doDocScores, boolean doMaxScore) throws IOException {
+      boolean doDocScores) throws IOException {
     if (after != null && !(after instanceof FieldDoc)) {
       // TODO: if we fix type safety of TopFieldDocs we can
       // remove this
       throw new IllegalArgumentException("after must be a FieldDoc; got " + after);
     }
-    return searchAfter((FieldDoc) after, query, numHits, sort, doDocScores, doMaxScore);
+    return searchAfter((FieldDoc) after, query, numHits, sort, doDocScores);
   }
 
   private TopFieldDocs searchAfter(FieldDoc after, Query query, int numHits, Sort sort,
-      boolean doDocScores, boolean doMaxScore) throws IOException {
+      boolean doDocScores) throws IOException {
     final int limit = Math.max(1, reader.maxDoc());
     if (after != null && after.doc >= limit) {
       throw new IllegalArgumentException("after.doc exceeds the number of documents in the reader: after.doc="
@@ -514,7 +514,7 @@ public class IndexSearcher {
       public TopFieldCollector newCollector() throws IOException {
         final boolean fillFields = true;
         // TODO: don't pay the price for accurate hit counts by default
-        return TopFieldCollector.create(rewrittenSort, cappedNumHits, after, fillFields, doDocScores, doMaxScore, true);
+        return TopFieldCollector.create(rewrittenSort, cappedNumHits, after, fillFields, doDocScores, true);
       }
 
       @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/java/org/apache/lucene/search/QueryRescorer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/QueryRescorer.java b/lucene/core/src/java/org/apache/lucene/search/QueryRescorer.java
index 1a128ec..b3452f4 100644
--- a/lucene/core/src/java/org/apache/lucene/search/QueryRescorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/QueryRescorer.java
@@ -135,7 +135,7 @@ public abstract class QueryRescorer extends Rescorer {
       hits = subset;
     }
 
-    return new TopDocs(firstPassTopDocs.totalHits, hits, hits[0].score);
+    return new TopDocs(firstPassTopDocs.totalHits, hits);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/java/org/apache/lucene/search/SortRescorer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/SortRescorer.java b/lucene/core/src/java/org/apache/lucene/search/SortRescorer.java
index b83e233..d8e16b1 100644
--- a/lucene/core/src/java/org/apache/lucene/search/SortRescorer.java
+++ b/lucene/core/src/java/org/apache/lucene/search/SortRescorer.java
@@ -54,7 +54,7 @@ public class SortRescorer extends Rescorer {
 
     List<LeafReaderContext> leaves = searcher.getIndexReader().leaves();
 
-    TopFieldCollector collector = TopFieldCollector.create(sort, topN, true, true, true, true);
+    TopFieldCollector collector = TopFieldCollector.create(sort, topN, true, true, true);
 
     // Now merge sort docIDs from hits, with reader's leaves:
     int hitUpto = 0;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/java/org/apache/lucene/search/TopDocs.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/TopDocs.java b/lucene/core/src/java/org/apache/lucene/search/TopDocs.java
index c1a4ca6..3a2fa58 100644
--- a/lucene/core/src/java/org/apache/lucene/search/TopDocs.java
+++ b/lucene/core/src/java/org/apache/lucene/search/TopDocs.java
@@ -28,31 +28,10 @@ public class TopDocs {
   /** The top hits for the query. */
   public ScoreDoc[] scoreDocs;
 
-  /** Stores the maximum score value encountered, needed for normalizing. */
-  private float maxScore;
-  
-  /**
-   * Returns the maximum score value encountered. Note that in case
-   * scores are not tracked, this returns {@link Float#NaN}.
-   */
-  public float getMaxScore() {
-    return maxScore;
-  }
-  
-  /** Sets the maximum score value encountered. */
-  public void setMaxScore(float maxScore) {
-    this.maxScore = maxScore;
-  }
-
-  /** Constructs a TopDocs with a default maxScore=Float.NaN. */
-  TopDocs(long totalHits, ScoreDoc[] scoreDocs) {
-    this(totalHits, scoreDocs, Float.NaN);
-  }
-
-  public TopDocs(long totalHits, ScoreDoc[] scoreDocs, float maxScore) {
+  /** Constructs a TopDocs. */
+  public TopDocs(long totalHits, ScoreDoc[] scoreDocs) {
     this.totalHits = totalHits;
     this.scoreDocs = scoreDocs;
-    this.maxScore = maxScore;
   }
 
   // Refers to one hit:
@@ -268,7 +247,6 @@ public class TopDocs {
 
     long totalHitCount = 0;
     int availHitCount = 0;
-    float maxScore = Float.MIN_VALUE;
     for(int shardIDX=0;shardIDX<shardHits.length;shardIDX++) {
       final TopDocs shard = shardHits[shardIDX];
       // totalHits can be non-zero even if no hits were
@@ -277,14 +255,9 @@ public class TopDocs {
       if (shard.scoreDocs != null && shard.scoreDocs.length > 0) {
         availHitCount += shard.scoreDocs.length;
         queue.add(new ShardRef(shardIDX, setShardIndex == false));
-        maxScore = Math.max(maxScore, shard.getMaxScore());
       }
     }
 
-    if (availHitCount == 0) {
-      maxScore = Float.NaN;
-    }
-
     final ScoreDoc[] hits;
     if (availHitCount <= start) {
       hits = new ScoreDoc[0];
@@ -320,9 +293,9 @@ public class TopDocs {
     }
 
     if (sort == null) {
-      return new TopDocs(totalHitCount, hits, maxScore);
+      return new TopDocs(totalHitCount, hits);
     } else {
-      return new TopFieldDocs(totalHitCount, hits, sort.getSort(), maxScore);
+      return new TopFieldDocs(totalHitCount, hits, sort.getSort());
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/java/org/apache/lucene/search/TopDocsCollector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/TopDocsCollector.java b/lucene/core/src/java/org/apache/lucene/search/TopDocsCollector.java
index 219ee3a..1ad3553 100644
--- a/lucene/core/src/java/org/apache/lucene/search/TopDocsCollector.java
+++ b/lucene/core/src/java/org/apache/lucene/search/TopDocsCollector.java
@@ -35,7 +35,7 @@ public abstract class TopDocsCollector<T extends ScoreDoc> implements Collector
 
   /** This is used in case topDocs() is called with illegal parameters, or there
    *  simply aren't (enough) results. */
-  protected static final TopDocs EMPTY_TOPDOCS = new TopDocs(0, new ScoreDoc[0], Float.NaN);
+  protected static final TopDocs EMPTY_TOPDOCS = new TopDocs(0, new ScoreDoc[0]);
   
   /**
    * The priority queue which holds the top documents. Note that different

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java b/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java
index 3d85277..3ccd9bb 100644
--- a/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java
+++ b/lucene/core/src/java/org/apache/lucene/search/TopFieldCollector.java
@@ -28,7 +28,7 @@ import org.apache.lucene.util.PriorityQueue;
  * A {@link Collector} that sorts by {@link SortField} using
  * {@link FieldComparator}s.
  * <p>
- * See the {@link #create(org.apache.lucene.search.Sort, int, boolean, boolean, boolean, boolean)} method
+ * See the {@link #create(org.apache.lucene.search.Sort, int, boolean, boolean, boolean)} method
  * for instantiating a TopFieldCollector.
  *
  * @lucene.experimental
@@ -94,24 +94,19 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
     final Sort sort;
     final FieldValueHitQueue<Entry> queue;
     final boolean trackDocScores;
-    final boolean trackMaxScore;
     final boolean mayNeedScoresTwice;
     final boolean trackTotalHits;
 
     public SimpleFieldCollector(Sort sort, FieldValueHitQueue<Entry> queue, int numHits, boolean fillFields,
-        boolean trackDocScores, boolean trackMaxScore, boolean trackTotalHits) {
-      super(queue, numHits, fillFields, sort.needsScores() || trackDocScores || trackMaxScore);
+        boolean trackDocScores, boolean trackTotalHits) {
+      super(queue, numHits, fillFields, sort.needsScores() || trackDocScores);
       this.sort = sort;
       this.queue = queue;
-      if (trackMaxScore) {
-        maxScore = Float.NEGATIVE_INFINITY; // otherwise we would keep NaN
-      }
       this.trackDocScores = trackDocScores;
-      this.trackMaxScore = trackMaxScore;
       // If one of the sort fields needs scores, and if we also track scores, then
       // we might call scorer.score() several times per doc so wrapping the scorer
       // to cache scores would help
-      this.mayNeedScoresTwice = sort.needsScores() && (trackDocScores || trackMaxScore);
+      this.mayNeedScoresTwice = sort.needsScores() && trackDocScores;
       this.trackTotalHits = trackTotalHits;
     }
 
@@ -123,7 +118,6 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
       final int[] reverseMul = queue.getReverseMul();
       final Sort indexSort = context.reader().getMetaData().getSort();
       final boolean canEarlyTerminate = trackTotalHits == false &&
-          trackMaxScore == false &&
           indexSort != null &&
           canEarlyTerminate(sort, indexSort);
       final int initialTotalHits = totalHits;
@@ -133,12 +127,6 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
         @Override
         public void collect(int doc) throws IOException {
           float score = Float.NaN;
-          if (trackMaxScore) {
-            score = scorer.score();
-            if (score > maxScore) {
-              maxScore = score;
-            }
-          }
 
           ++totalHits;
           if (queueFull) {
@@ -158,7 +146,7 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
               }
             }
 
-            if (trackDocScores && !trackMaxScore) {
+            if (trackDocScores) {
               score = scorer.score();
             }
 
@@ -170,7 +158,7 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
             // Startup transient: queue hasn't gathered numHits yet
             final int slot = totalHits - 1;
 
-            if (trackDocScores && !trackMaxScore) {
+            if (trackDocScores) {
               score = scorer.score();
             }
 
@@ -197,27 +185,20 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
     int collectedHits;
     final FieldValueHitQueue<Entry> queue;
     final boolean trackDocScores;
-    final boolean trackMaxScore;
     final FieldDoc after;
     final boolean mayNeedScoresTwice;
     final boolean trackTotalHits;
 
     public PagingFieldCollector(Sort sort, FieldValueHitQueue<Entry> queue, FieldDoc after, int numHits, boolean fillFields,
-                                boolean trackDocScores, boolean trackMaxScore, boolean trackTotalHits) {
-      super(queue, numHits, fillFields, trackDocScores || trackMaxScore || sort.needsScores());
+                                boolean trackDocScores, boolean trackTotalHits) {
+      super(queue, numHits, fillFields, trackDocScores || sort.needsScores());
       this.sort = sort;
       this.queue = queue;
       this.trackDocScores = trackDocScores;
-      this.trackMaxScore = trackMaxScore;
       this.after = after;
-      this.mayNeedScoresTwice = sort.needsScores() && (trackDocScores || trackMaxScore);
+      this.mayNeedScoresTwice = sort.needsScores() && trackDocScores;
       this.trackTotalHits = trackTotalHits;
 
-      // Must set maxScore to NEG_INF, or otherwise Math.max always returns NaN.
-      if (trackMaxScore) {
-        maxScore = Float.NEGATIVE_INFINITY;
-      }
-
       FieldComparator<?>[] comparators = queue.comparators;
       // Tell all comparators their top value:
       for(int i=0;i<comparators.length;i++) {
@@ -233,7 +214,6 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
       final int afterDoc = after.doc - docBase;
       final Sort indexSort = context.reader().getMetaData().getSort();
       final boolean canEarlyTerminate = trackTotalHits == false &&
-          trackMaxScore == false &&
           indexSort != null &&
           canEarlyTerminate(sort, indexSort);
       final int initialTotalHits = totalHits;
@@ -246,12 +226,6 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
           totalHits++;
 
           float score = Float.NaN;
-          if (trackMaxScore) {
-            score = scorer.score();
-            if (score > maxScore) {
-              maxScore = score;
-            }
-          }
 
           if (queueFull) {
             // Fastmatch: return if this hit is no better than
@@ -283,7 +257,7 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
             comparator.copy(bottom.slot, doc);
 
             // Compute score only if it is competitive.
-            if (trackDocScores && !trackMaxScore) {
+            if (trackDocScores) {
               score = scorer.score();
             }
             updateBottom(doc, score);
@@ -299,7 +273,7 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
             comparator.copy(slot, doc);
 
             // Compute score only if it is competitive.
-            if (trackDocScores && !trackMaxScore) {
+            if (trackDocScores) {
               score = scorer.score();
             }
             bottom = pq.add(new Entry(slot, docBase + doc, score));
@@ -318,12 +292,6 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
 
   private final boolean fillFields;
 
-  /*
-   * Stores the maximum score value encountered, needed for normalizing. If
-   * document scores are not tracked, this value is initialized to NaN.
-   */
-  float maxScore = Float.NaN;
-
   final int numHits;
   FieldValueHitQueue.Entry bottom = null;
   boolean queueFull;
@@ -370,13 +338,6 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
    *          it incurs the score computation on each competitive result.
    *          Therefore if document scores are not required by the application,
    *          it is recommended to set it to false.
-   * @param trackMaxScore
-   *          specifies whether the query's maxScore should be tracked and set
-   *          on the resulting {@link TopDocs}. Note that if set to false,
-   *          {@link TopDocs#getMaxScore()} returns Float.NaN. Setting this to
-   *          true affects performance as it incurs the score computation on
-   *          each result. Also, setting this true automatically sets
-   *          <code>trackDocScores</code> to true as well.
    * @param trackTotalHits
    *          specifies whether the total number of hits should be tracked. If
    *          set to false, the value of {@link TopFieldDocs#totalHits} will be
@@ -385,8 +346,8 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
    *         the sort criteria.
    */
   public static TopFieldCollector create(Sort sort, int numHits,
-      boolean fillFields, boolean trackDocScores, boolean trackMaxScore, boolean trackTotalHits) {
-    return create(sort, numHits, null, fillFields, trackDocScores, trackMaxScore, trackTotalHits);
+      boolean fillFields, boolean trackDocScores, boolean trackTotalHits) {
+    return create(sort, numHits, null, fillFields, trackDocScores, trackTotalHits);
   }
 
   /**
@@ -413,12 +374,6 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
    *          it incurs the score computation on each competitive result.
    *          Therefore if document scores are not required by the application,
    *          it is recommended to set it to false.
-   * @param trackMaxScore
-   *          specifies whether the query's maxScore should be tracked and set
-   *          on the resulting {@link TopDocs}. Note that if set to false,
-   *          {@link TopDocs#getMaxScore()} returns Float.NaN. Setting this to
-   *          true affects performance as it incurs the score computation on
-   *          each result. Also, setting this true automatically sets
    *          <code>trackDocScores</code> to true as well.
    * @param trackTotalHits
    *          specifies whether the total number of hits should be tracked. If
@@ -428,7 +383,7 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
    *         the sort criteria.
    */
   public static TopFieldCollector create(Sort sort, int numHits, FieldDoc after,
-      boolean fillFields, boolean trackDocScores, boolean trackMaxScore, boolean trackTotalHits) {
+      boolean fillFields, boolean trackDocScores, boolean trackTotalHits) {
 
     if (sort.fields.length == 0) {
       throw new IllegalArgumentException("Sort must contain at least one field");
@@ -441,7 +396,7 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
     FieldValueHitQueue<Entry> queue = FieldValueHitQueue.create(sort.fields, numHits);
 
     if (after == null) {
-      return new SimpleFieldCollector(sort, queue, numHits, fillFields, trackDocScores, trackMaxScore, trackTotalHits);
+      return new SimpleFieldCollector(sort, queue, numHits, fillFields, trackDocScores, trackTotalHits);
     } else {
       if (after.fields == null) {
         throw new IllegalArgumentException("after.fields wasn't set; you must pass fillFields=true for the previous search");
@@ -451,7 +406,7 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
         throw new IllegalArgumentException("after.fields has " + after.fields.length + " values but sort has " + sort.getSort().length);
       }
 
-      return new PagingFieldCollector(sort, queue, after, numHits, fillFields, trackDocScores, trackMaxScore, trackTotalHits);
+      return new PagingFieldCollector(sort, queue, after, numHits, fillFields, trackDocScores, trackTotalHits);
     }
   }
 
@@ -497,12 +452,10 @@ public abstract class TopFieldCollector extends TopDocsCollector<Entry> {
   protected TopDocs newTopDocs(ScoreDoc[] results, int start) {
     if (results == null) {
       results = EMPTY_SCOREDOCS;
-      // Set maxScore to NaN, in case this is a maxScore tracking collector.
-      maxScore = Float.NaN;
     }
 
     // If this is a maxScoring tracking collector and there were no results,
-    return new TopFieldDocs(totalHits, results, ((FieldValueHitQueue<Entry>) pq).getFields(), maxScore);
+    return new TopFieldDocs(totalHits, results, ((FieldValueHitQueue<Entry>) pq).getFields());
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/java/org/apache/lucene/search/TopFieldDocs.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/TopFieldDocs.java b/lucene/core/src/java/org/apache/lucene/search/TopFieldDocs.java
index 52a51b7..95c7dee 100644
--- a/lucene/core/src/java/org/apache/lucene/search/TopFieldDocs.java
+++ b/lucene/core/src/java/org/apache/lucene/search/TopFieldDocs.java
@@ -30,10 +30,9 @@ public class TopFieldDocs extends TopDocs {
    * @param totalHits  Total number of hits for the query.
    * @param scoreDocs  The top hits for the query.
    * @param fields     The sort criteria used to find the top hits.
-   * @param maxScore   The maximum score encountered.
    */
-  public TopFieldDocs (long totalHits, ScoreDoc[] scoreDocs, SortField[] fields, float maxScore) {
-    super (totalHits, scoreDocs, maxScore);
+  public TopFieldDocs (long totalHits, ScoreDoc[] scoreDocs, SortField[] fields) {
+    super (totalHits, scoreDocs);
     this.fields = fields;
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/java/org/apache/lucene/search/TopScoreDocCollector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/search/TopScoreDocCollector.java b/lucene/core/src/java/org/apache/lucene/search/TopScoreDocCollector.java
index afae1fc..a319de7 100644
--- a/lucene/core/src/java/org/apache/lucene/search/TopScoreDocCollector.java
+++ b/lucene/core/src/java/org/apache/lucene/search/TopScoreDocCollector.java
@@ -148,7 +148,7 @@ public abstract class TopScoreDocCollector extends TopDocsCollector<ScoreDoc> {
 
     @Override
     protected TopDocs newTopDocs(ScoreDoc[] results, int start) {
-      return results == null ? new TopDocs(totalHits, new ScoreDoc[0], Float.NaN) : new TopDocs(totalHits, results);
+      return results == null ? new TopDocs(totalHits, new ScoreDoc[0]) : new TopDocs(totalHits, results);
     }
 
     @Override
@@ -240,19 +240,7 @@ public abstract class TopScoreDocCollector extends TopDocsCollector<ScoreDoc> {
       return EMPTY_TOPDOCS;
     }
 
-    // We need to compute maxScore in order to set it in TopDocs. If start == 0,
-    // it means the largest element is already in results, use its score as
-    // maxScore. Otherwise pop everything else, until the largest element is
-    // extracted and use its score as maxScore.
-    float maxScore = Float.NaN;
-    if (start == 0) {
-      maxScore = results[0].score;
-    } else {
-      for (int i = pq.size(); i > 1; i--) { pq.pop(); }
-      maxScore = pq.pop().score;
-    }
-
-    return new TopDocs(totalHits, results, maxScore);
+    return new TopDocs(totalHits, results);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/test/org/apache/lucene/index/TestIndexSorting.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/index/TestIndexSorting.java b/lucene/core/src/test/org/apache/lucene/index/TestIndexSorting.java
index 3679d20..9f12ca2 100644
--- a/lucene/core/src/test/org/apache/lucene/index/TestIndexSorting.java
+++ b/lucene/core/src/test/org/apache/lucene/index/TestIndexSorting.java
@@ -2324,11 +2324,11 @@ public class TestIndexSorting extends LuceneTestCase {
         System.out.println("TEST: iter=" + iter + " numHits=" + numHits);
       }
 
-      TopFieldCollector c1 = TopFieldCollector.create(sort, numHits, true, true, true, true);
+      TopFieldCollector c1 = TopFieldCollector.create(sort, numHits, true, true, true);
       s1.search(new MatchAllDocsQuery(), c1);
       TopDocs hits1 = c1.topDocs();
 
-      TopFieldCollector c2 = TopFieldCollector.create(sort, numHits, true, true, true, false);
+      TopFieldCollector c2 = TopFieldCollector.create(sort, numHits, true, true, false);
       s2.search(new MatchAllDocsQuery(), c2);
 
       TopDocs hits2 = c2.topDocs();
@@ -2344,7 +2344,6 @@ public class TestIndexSorting extends LuceneTestCase {
         }
       }
 
-      assertTrue(hits2.totalHits <= hits1.totalHits);
       assertEquals(hits2.scoreDocs.length, hits1.scoreDocs.length);
       for(int i=0;i<hits2.scoreDocs.length;i++) {
         ScoreDoc hit1 = hits1.scoreDocs[i];

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/test/org/apache/lucene/search/TestBoolean2.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestBoolean2.java b/lucene/core/src/test/org/apache/lucene/search/TestBoolean2.java
index 66b895a..7522cd0 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestBoolean2.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestBoolean2.java
@@ -386,10 +386,10 @@ public class TestBoolean2 extends LuceneTestCase {
         }
 
         // check diff (randomized) scorers (from AssertingSearcher) produce the same results
-        TopFieldCollector collector = TopFieldCollector.create(sort, 1000, false, true, true, false);
+        TopFieldCollector collector = TopFieldCollector.create(sort, 1000, false, true, false);
         searcher.search(q1, collector);
         ScoreDoc[] hits1 = collector.topDocs().scoreDocs;
-        collector = TopFieldCollector.create(sort, 1000, false, true, true, false);
+        collector = TopFieldCollector.create(sort, 1000, false, true, false);
         searcher.search(q1, collector);
         ScoreDoc[] hits2 = collector.topDocs().scoreDocs;
         tot+=hits2.length;
@@ -402,10 +402,10 @@ public class TestBoolean2 extends LuceneTestCase {
         assertEquals(mulFactor*collector.totalHits + NUM_EXTRA_DOCS/2, hits4.totalHits);
 
         // test diff (randomized) scorers produce the same results on bigSearcher as well
-        collector = TopFieldCollector.create(sort, 1000 * mulFactor, false, true, true, false);
+        collector = TopFieldCollector.create(sort, 1000 * mulFactor, false, true, false);
         bigSearcher.search(q1, collector);
         hits1 = collector.topDocs().scoreDocs;
-        collector = TopFieldCollector.create(sort, 1000 * mulFactor, false, true, true, false);
+        collector = TopFieldCollector.create(sort, 1000 * mulFactor, false, true, false);
         bigSearcher.search(q1, collector);
         hits2 = collector.topDocs().scoreDocs;
         CheckHits.checkEqual(q1, hits1, hits2);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/test/org/apache/lucene/search/TestDoubleValuesSource.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestDoubleValuesSource.java b/lucene/core/src/test/org/apache/lucene/search/TestDoubleValuesSource.java
index 49b0e11..9806add 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestDoubleValuesSource.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestDoubleValuesSource.java
@@ -163,9 +163,9 @@ public class TestDoubleValuesSource extends LuceneTestCase {
 
   void checkSorts(Query query, Sort sort) throws Exception {
     int size = TestUtil.nextInt(random(), 1, searcher.getIndexReader().maxDoc() / 5);
-    TopDocs expected = searcher.search(query, size, sort, random().nextBoolean(), random().nextBoolean());
+    TopDocs expected = searcher.search(query, size, sort, random().nextBoolean());
     Sort mutatedSort = convertSortToSortable(sort);
-    TopDocs actual = searcher.search(query, size, mutatedSort, random().nextBoolean(), random().nextBoolean());
+    TopDocs actual = searcher.search(query, size, mutatedSort, random().nextBoolean());
 
     CheckHits.checkEqual(query, expected.scoreDocs, actual.scoreDocs);
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/test/org/apache/lucene/search/TestElevationComparator.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestElevationComparator.java b/lucene/core/src/test/org/apache/lucene/search/TestElevationComparator.java
index 3178c35..bc849e9 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestElevationComparator.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestElevationComparator.java
@@ -86,7 +86,7 @@ public class TestElevationComparator extends LuceneTestCase {
         new SortField(null, SortField.Type.SCORE, reversed)
       );
 
-    TopDocsCollector<Entry> topCollector = TopFieldCollector.create(sort, 50, false, true, true, true);
+    TopDocsCollector<Entry> topCollector = TopFieldCollector.create(sort, 50, false, true, true);
     searcher.search(newq.build(), topCollector);
 
     TopDocs topDocs = topCollector.topDocs(0, 10);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/test/org/apache/lucene/search/TestIndexSearcher.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestIndexSearcher.java b/lucene/core/src/test/org/apache/lucene/search/TestIndexSearcher.java
index 206ee86..37f90de 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestIndexSearcher.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestIndexSearcher.java
@@ -100,15 +100,11 @@ public class TestIndexSearcher extends LuceneTestCase {
             searcher.searchAfter(after, query, Integer.MAX_VALUE);
             if (sort != null) {
               searcher.search(query, Integer.MAX_VALUE, sort);
-              searcher.search(query, Integer.MAX_VALUE, sort, true, true);
-              searcher.search(query, Integer.MAX_VALUE, sort, true, false);
-              searcher.search(query, Integer.MAX_VALUE, sort, false, true);
-              searcher.search(query, Integer.MAX_VALUE, sort, false, false);
+              searcher.search(query, Integer.MAX_VALUE, sort, true);
+              searcher.search(query, Integer.MAX_VALUE, sort, false);
               searcher.searchAfter(after, query, Integer.MAX_VALUE, sort);
-              searcher.searchAfter(after, query, Integer.MAX_VALUE, sort, true, true);
-              searcher.searchAfter(after, query, Integer.MAX_VALUE, sort, true, false);
-              searcher.searchAfter(after, query, Integer.MAX_VALUE, sort, false, true);
-              searcher.searchAfter(after, query, Integer.MAX_VALUE, sort, false, false);
+              searcher.searchAfter(after, query, Integer.MAX_VALUE, sort, true);
+              searcher.searchAfter(after, query, Integer.MAX_VALUE, sort, false);
             }
           }
         }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/test/org/apache/lucene/search/TestLongValuesSource.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestLongValuesSource.java b/lucene/core/src/test/org/apache/lucene/search/TestLongValuesSource.java
index 4c77e7e..f33292d 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestLongValuesSource.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestLongValuesSource.java
@@ -136,8 +136,8 @@ public class TestLongValuesSource extends LuceneTestCase {
   void checkSorts(Query query, Sort sort) throws Exception {
     int size = TestUtil.nextInt(random(), 1, searcher.getIndexReader().maxDoc() / 5);
     Sort mutatedSort = convertSortToSortable(sort);
-    TopDocs actual = searcher.search(query, size, mutatedSort, random().nextBoolean(), random().nextBoolean());
-    TopDocs expected = searcher.search(query, size, sort, random().nextBoolean(), random().nextBoolean());
+    TopDocs actual = searcher.search(query, size, mutatedSort, random().nextBoolean());
+    TopDocs expected = searcher.search(query, size, sort, random().nextBoolean());
 
     CheckHits.checkEqual(query, expected.scoreDocs, actual.scoreDocs);
 

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/test/org/apache/lucene/search/TestSearchAfter.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestSearchAfter.java b/lucene/core/src/test/org/apache/lucene/search/TestSearchAfter.java
index 7017dde..363c974 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestSearchAfter.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestSearchAfter.java
@@ -216,14 +216,13 @@ public class TestSearchAfter extends LuceneTestCase {
     if (VERBOSE) {
       System.out.println("\nassertQuery " + (iter++) + ": query=" + query + " sort=" + sort + " pageSize=" + pageSize);
     }
-    final boolean doMaxScore = random().nextBoolean();
     final boolean doScores = random().nextBoolean();
     if (sort == null) {
       all = searcher.search(query, maxDoc);
     } else if (sort == Sort.RELEVANCE) {
-      all = searcher.search(query, maxDoc, sort, true, doMaxScore);
+      all = searcher.search(query, maxDoc, sort, true);
     } else {
-      all = searcher.search(query, maxDoc, sort, doScores, doMaxScore);
+      all = searcher.search(query, maxDoc, sort, doScores);
     }
     if (VERBOSE) {
       System.out.println("  all.totalHits=" + all.totalHits);
@@ -246,9 +245,9 @@ public class TestSearchAfter extends LuceneTestCase {
           System.out.println("  iter lastBottom=" + lastBottom);
         }
         if (sort == Sort.RELEVANCE) {
-          paged = searcher.searchAfter(lastBottom, query, pageSize, sort, true, doMaxScore);
+          paged = searcher.searchAfter(lastBottom, query, pageSize, sort, true);
         } else {
-          paged = searcher.searchAfter(lastBottom, query, pageSize, sort, doScores, doMaxScore);
+          paged = searcher.searchAfter(lastBottom, query, pageSize, sort, doScores);
         }
       }
       if (VERBOSE) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/test/org/apache/lucene/search/TestShardSearching.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestShardSearching.java b/lucene/core/src/test/org/apache/lucene/search/TestShardSearching.java
index ebc7062..df34107 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestShardSearching.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestShardSearching.java
@@ -328,12 +328,12 @@ public class TestShardSearching extends ShardSearchingTestBase {
         System.out.println("  shard=" + shardID + " maxDoc=" + shardSearchers[shardID].searcher.getIndexReader().maxDoc());
       }
       */
-      System.out.println("  single searcher: " + hits.totalHits + " totalHits maxScore=" + hits.getMaxScore());
+      System.out.println("  single searcher: " + hits.totalHits);
       for(int i=0;i<hits.scoreDocs.length;i++) {
         final ScoreDoc sd = hits.scoreDocs[i];
         System.out.println("    doc=" + sd.doc + " score=" + sd.score);
       }
-      System.out.println("  shard searcher: " + shardHits.totalHits + " totalHits maxScore=" + shardHits.getMaxScore());
+      System.out.println("  shard searcher: " + shardHits.totalHits);
       for(int i=0;i<shardHits.scoreDocs.length;i++) {
         final ScoreDoc sd = shardHits.scoreDocs[i];
         System.out.println("    doc=" + sd.doc + " (rebased: " + (sd.doc + base[sd.shardIndex]) + ") score=" + sd.score + " shard=" + sd.shardIndex);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/test/org/apache/lucene/search/TestSortRandom.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestSortRandom.java b/lucene/core/src/test/org/apache/lucene/search/TestSortRandom.java
index 05b016c..a96399e 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestSortRandom.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestSortRandom.java
@@ -146,7 +146,7 @@ public class TestSortRandom extends LuceneTestCase {
       }
       final int hitCount = TestUtil.nextInt(random, 1, r.maxDoc() + 20);
       final RandomQuery f = new RandomQuery(random.nextLong(), random.nextFloat(), docValues);
-      hits = s.search(f, hitCount, sort, random.nextBoolean(), random.nextBoolean());
+      hits = s.search(f, hitCount, sort, random.nextBoolean());
 
       if (VERBOSE) {
         System.out.println("\nTEST: iter=" + iter + " " + hits.totalHits + " hits; topN=" + hitCount + "; reverse=" + reverse + "; sortMissingLast=" + sortMissingLast + " sort=" + sort);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/test/org/apache/lucene/search/TestSortedNumericSortField.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestSortedNumericSortField.java b/lucene/core/src/test/org/apache/lucene/search/TestSortedNumericSortField.java
index 210ff89..37fb710 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestSortedNumericSortField.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestSortedNumericSortField.java
@@ -36,13 +36,13 @@ public class TestSortedNumericSortField extends LuceneTestCase {
   
     Sort sort = new Sort();
     sort.setSort(new SortedNumericSortField("sortednumeric", SortField.Type.LONG));
-    TopDocs td = empty.search(query, 10, sort, true, true);
+    TopDocs td = empty.search(query, 10, sort, true);
     assertEquals(0, td.totalHits);
     
     // for an empty index, any selector should work
     for (SortedNumericSelector.Type v : SortedNumericSelector.Type.values()) {
       sort.setSort(new SortedNumericSortField("sortednumeric", SortField.Type.LONG, false, v));
-      td = empty.search(query, 10, sort, true, true);
+      td = empty.search(query, 10, sort, true);
       assertEquals(0, td.totalHits);
     }
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/test/org/apache/lucene/search/TestSortedSetSortField.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestSortedSetSortField.java b/lucene/core/src/test/org/apache/lucene/search/TestSortedSetSortField.java
index 7b4ca27..899e46d 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestSortedSetSortField.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestSortedSetSortField.java
@@ -37,13 +37,13 @@ public class TestSortedSetSortField extends LuceneTestCase {
   
     Sort sort = new Sort();
     sort.setSort(new SortedSetSortField("sortedset", false));
-    TopDocs td = empty.search(query, 10, sort, true, true);
+    TopDocs td = empty.search(query, 10, sort, true);
     assertEquals(0, td.totalHits);
     
     // for an empty index, any selector should work
     for (SortedSetSelector.Type v : SortedSetSelector.Type.values()) {
       sort.setSort(new SortedSetSortField("sortedset", false, v));
-      td = empty.search(query, 10, sort, true, true);
+      td = empty.search(query, 10, sort, true);
       assertEquals(0, td.totalHits);
     }
   }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/test/org/apache/lucene/search/TestTopDocsCollector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestTopDocsCollector.java b/lucene/core/src/test/org/apache/lucene/search/TestTopDocsCollector.java
index 17c5f85..4cf36ef 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestTopDocsCollector.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestTopDocsCollector.java
@@ -46,15 +46,7 @@ public class TestTopDocsCollector extends LuceneTestCase {
         return EMPTY_TOPDOCS;
       }
       
-      float maxScore = Float.NaN;
-      if (start == 0) {
-        maxScore = results[0].score;
-      } else {
-        for (int i = pq.size(); i > 1; i--) { pq.pop(); }
-        maxScore = pq.pop().score;
-      }
-      
-      return new TopDocs(totalHits, results, maxScore);
+      return new TopDocs(totalHits, results);
     }
     
     @Override
@@ -188,18 +180,6 @@ public class TestTopDocsCollector extends LuceneTestCase {
     assertEquals(5, tdc.topDocs(10).scoreDocs.length);
   }
   
-  public void testMaxScore() throws Exception {
-    // ask for all results
-    TopDocsCollector<ScoreDoc> tdc = doSearch(15);
-    TopDocs td = tdc.topDocs();
-    assertEquals(MAX_SCORE, td.getMaxScore(), 0f);
-    
-    // ask for 5 last results
-    tdc = doSearch(15);
-    td = tdc.topDocs(10);
-    assertEquals(MAX_SCORE, td.getMaxScore(), 0f);
-  }
-  
   // This does not test the PQ's correctness, but whether topDocs()
   // implementations return the results in decreasing score order.
   public void testResultsOrder() throws Exception {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/test/org/apache/lucene/search/TestTopDocsMerge.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestTopDocsMerge.java b/lucene/core/src/test/org/apache/lucene/search/TestTopDocsMerge.java
index 0173cf9..65de8f5 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestTopDocsMerge.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestTopDocsMerge.java
@@ -275,13 +275,13 @@ public class TestTopDocsMerge extends LuceneTestCase {
             tempTopHits.scoreDocs = newScoreDocs;
             topHits = tempTopHits;
           } else {
-            topHits = new TopDocs(tempTopHits.totalHits, new ScoreDoc[0], tempTopHits.getMaxScore());
+            topHits = new TopDocs(tempTopHits.totalHits, new ScoreDoc[0]);
           }
         } else {
           topHits = searcher.search(query, numHits);
         }
       } else {
-        final TopFieldCollector c = TopFieldCollector.create(sort, numHits, true, true, true, true);
+        final TopFieldCollector c = TopFieldCollector.create(sort, numHits, true, true, true);
         searcher.search(query, c);
         if (useFrom) {
           from = TestUtil.nextInt(random(), 0, numHits - 1);
@@ -295,7 +295,7 @@ public class TestTopDocsMerge extends LuceneTestCase {
             tempTopHits.scoreDocs = newScoreDocs;
             topHits = tempTopHits;
           } else {
-            topHits = new TopDocs(tempTopHits.totalHits, new ScoreDoc[0], tempTopHits.getMaxScore());
+            topHits = new TopDocs(tempTopHits.totalHits, new ScoreDoc[0]);
           }
         } else {
           topHits = c.topDocs(0, numHits);
@@ -306,7 +306,7 @@ public class TestTopDocsMerge extends LuceneTestCase {
         if (useFrom) {
           System.out.println("from=" + from + " size=" + size);
         }
-        System.out.println("  top search: " + topHits.totalHits + " totalHits; hits=" + (topHits.scoreDocs == null ? "null" : topHits.scoreDocs.length + " maxScore=" + topHits.getMaxScore()));
+        System.out.println("  top search: " + topHits.totalHits + " totalHits; hits=" + (topHits.scoreDocs == null ? "null" : topHits.scoreDocs.length));
         if (topHits.scoreDocs != null) {
           for(int hitIDX=0;hitIDX<topHits.scoreDocs.length;hitIDX++) {
             final ScoreDoc sd = topHits.scoreDocs[hitIDX];
@@ -330,7 +330,7 @@ public class TestTopDocsMerge extends LuceneTestCase {
         if (sort == null) {
           subHits = subSearcher.search(w, numHits);
         } else {
-          final TopFieldCollector c = TopFieldCollector.create(sort, numHits, true, true, true, true);
+          final TopFieldCollector c = TopFieldCollector.create(sort, numHits, true, true, true);
           subSearcher.search(w, c);
           subHits = c.topDocs(0, numHits);
         }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollector.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollector.java b/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollector.java
index f12e910..a7f4cda 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollector.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollector.java
@@ -71,7 +71,7 @@ public class TestTopFieldCollector extends LuceneTestCase {
     for(int i = 0; i < sort.length; i++) {
       Query q = new MatchAllDocsQuery();
       TopDocsCollector<Entry> tdc = TopFieldCollector.create(sort[i], 10, false,
-          false, false, true);
+          false, true);
       
       is.search(q, tdc);
       
@@ -90,7 +90,7 @@ public class TestTopFieldCollector extends LuceneTestCase {
     for(int i = 0; i < sort.length; i++) {
       Query q = new MatchAllDocsQuery();
       TopDocsCollector<Entry> tdc = TopFieldCollector.create(sort[i], 10, true, false,
-          false, true);
+          true);
       
       is.search(q, tdc);
       
@@ -99,7 +99,6 @@ public class TestTopFieldCollector extends LuceneTestCase {
       for(int j = 0; j < sd.length; j++) {
         assertTrue(Float.isNaN(sd[j].score));
       }
-      assertTrue(Float.isNaN(td.getMaxScore()));
     }
   }
 
@@ -111,10 +110,10 @@ public class TestTopFieldCollector extends LuceneTestCase {
       // the index is not sorted
       TopDocsCollector<Entry> tdc;
       if (i % 2 == 0) {
-        tdc =  TopFieldCollector.create(sort, 10, true, false, false, false);
+        tdc =  TopFieldCollector.create(sort, 10, true, false, false);
       } else {
         FieldDoc fieldDoc = new FieldDoc(1, Float.NaN, new Object[] { 1 });
-        tdc = TopFieldCollector.create(sort, 10, fieldDoc, true, false, false, false);
+        tdc = TopFieldCollector.create(sort, 10, fieldDoc, true, false, false);
       }
 
       is.search(q, tdc);
@@ -124,59 +123,17 @@ public class TestTopFieldCollector extends LuceneTestCase {
       for(int j = 0; j < sd.length; j++) {
         assertTrue(Float.isNaN(sd[j].score));
       }
-      assertTrue(Float.isNaN(td.getMaxScore()));
-    }
-  }
-  
-  public void testSortWithScoreNoMaxScoreTracking() throws Exception {
-    
-    // Two Sort criteria to instantiate the multi/single comparators.
-    Sort[] sort = new Sort[] {new Sort(SortField.FIELD_DOC), new Sort() };
-    for(int i = 0; i < sort.length; i++) {
-      Query q = new MatchAllDocsQuery();
-      TopDocsCollector<Entry> tdc = TopFieldCollector.create(sort[i], 10, true, true,
-          false, true);
-      
-      is.search(q, tdc);
-      
-      TopDocs td = tdc.topDocs();
-      ScoreDoc[] sd = td.scoreDocs;
-      for(int j = 0; j < sd.length; j++) {
-        assertTrue(!Float.isNaN(sd[j].score));
-      }
-      assertTrue(Float.isNaN(td.getMaxScore()));
-    }
-  }
-  
-  // MultiComparatorScoringNoMaxScoreCollector
-  public void testSortWithScoreNoMaxScoreTrackingMulti() throws Exception {
-    
-    // Two Sort criteria to instantiate the multi/single comparators.
-    Sort[] sort = new Sort[] {new Sort(SortField.FIELD_DOC, SortField.FIELD_SCORE) };
-    for(int i = 0; i < sort.length; i++) {
-      Query q = new MatchAllDocsQuery();
-      TopDocsCollector<Entry> tdc = TopFieldCollector.create(sort[i], 10, true, true,
-          false, true);
-
-      is.search(q, tdc);
-      
-      TopDocs td = tdc.topDocs();
-      ScoreDoc[] sd = td.scoreDocs;
-      for(int j = 0; j < sd.length; j++) {
-        assertTrue(!Float.isNaN(sd[j].score));
-      }
-      assertTrue(Float.isNaN(td.getMaxScore()));
     }
   }
   
-  public void testSortWithScoreAndMaxScoreTracking() throws Exception {
+  public void testSortWithScoreTracking() throws Exception {
     
     // Two Sort criteria to instantiate the multi/single comparators.
     Sort[] sort = new Sort[] {new Sort(SortField.FIELD_DOC), new Sort() };
     for(int i = 0; i < sort.length; i++) {
       Query q = new MatchAllDocsQuery();
       TopDocsCollector<Entry> tdc = TopFieldCollector.create(sort[i], 10, true, true,
-          true, true);
+          true);
       
       is.search(q, tdc);
       
@@ -185,19 +142,17 @@ public class TestTopFieldCollector extends LuceneTestCase {
       for(int j = 0; j < sd.length; j++) {
         assertTrue(!Float.isNaN(sd[j].score));
       }
-      assertTrue(!Float.isNaN(td.getMaxScore()));
     }
   }
 
-  public void testSortWithScoreAndMaxScoreTrackingNoResults() throws Exception {
+  public void testSortWithScoreTrackingNoResults() throws Exception {
     
     // Two Sort criteria to instantiate the multi/single comparators.
     Sort[] sort = new Sort[] {new Sort(SortField.FIELD_DOC), new Sort() };
     for(int i = 0; i < sort.length; i++) {
-      TopDocsCollector<Entry> tdc = TopFieldCollector.create(sort[i], 10, true, true, true, true);
+      TopDocsCollector<Entry> tdc = TopFieldCollector.create(sort[i], 10, true, true, true);
       TopDocs td = tdc.topDocs();
       assertEquals(0, td.totalHits);
-      assertTrue(Float.isNaN(td.getMaxScore()));
     }
   }
 
@@ -228,55 +183,53 @@ public class TestTopFieldCollector extends LuceneTestCase {
     final IndexSearcher searcher = new IndexSearcher(reader);
     for (Sort sort : new Sort[] {new Sort(SortField.FIELD_SCORE), new Sort(new SortField("f", SortField.Type.SCORE))}) {
       for (boolean doDocScores : new boolean[] {false, true}) {
-        for (boolean doMaxScore : new boolean[] {false, true}) {
-          final TopFieldCollector topCollector = TopFieldCollector.create(sort, TestUtil.nextInt(random(), 1, 2), true, doDocScores, doMaxScore, true);
-          final Collector assertingCollector = new Collector() {
-            @Override
-            public LeafCollector getLeafCollector(LeafReaderContext context) throws IOException {
-              final LeafCollector in = topCollector.getLeafCollector(context);
-              return new FilterLeafCollector(in) {
-                @Override
-                public void setScorer(final Scorer scorer) throws IOException {
-                  Scorer s = new Scorer(null) {
-
-                    int lastComputedDoc = -1;
-                    
-                    @Override
-                    public float score() throws IOException {
-                      if (lastComputedDoc == docID()) {
-                        throw new AssertionError("Score computed twice on " + docID());
-                      }
-                      lastComputedDoc = docID();
-                      return scorer.score();
-                    }
-
-                    @Override
-                    public float getMaxScore(int upTo) throws IOException {
-                      return scorer.getMaxScore(upTo);
-                    }
-
-                    @Override
-                    public int docID() {
-                      return scorer.docID();
-                    }
-
-                    @Override
-                    public DocIdSetIterator iterator() {
-                      return scorer.iterator();
+        final TopFieldCollector topCollector = TopFieldCollector.create(sort, TestUtil.nextInt(random(), 1, 2), true, doDocScores, true);
+        final Collector assertingCollector = new Collector() {
+          @Override
+          public LeafCollector getLeafCollector(LeafReaderContext context) throws IOException {
+            final LeafCollector in = topCollector.getLeafCollector(context);
+            return new FilterLeafCollector(in) {
+              @Override
+              public void setScorer(final Scorer scorer) throws IOException {
+                Scorer s = new Scorer(null) {
+
+                  int lastComputedDoc = -1;
+
+                  @Override
+                  public float score() throws IOException {
+                    if (lastComputedDoc == docID()) {
+                      throw new AssertionError("Score computed twice on " + docID());
                     }
-                    
-                  };
-                  super.setScorer(s);
-                }
-              };
-            }
-            @Override
-            public ScoreMode scoreMode() {
-              return topCollector.scoreMode();
-            }
-          };
-          searcher.search(query, assertingCollector);
-        }
+                    lastComputedDoc = docID();
+                    return scorer.score();
+                  }
+
+                  @Override
+                  public float getMaxScore(int upTo) throws IOException {
+                    return scorer.getMaxScore(upTo);
+                  }
+
+                  @Override
+                  public int docID() {
+                    return scorer.docID();
+                  }
+
+                  @Override
+                  public DocIdSetIterator iterator() {
+                    return scorer.iterator();
+                  }
+
+                };
+                super.setScorer(s);
+              }
+            };
+          }
+          @Override
+          public ScoreMode scoreMode() {
+            return topCollector.scoreMode();
+          }
+        };
+        searcher.search(query, assertingCollector);
       }
     }
     reader.close();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollectorEarlyTermination.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollectorEarlyTermination.java b/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollectorEarlyTermination.java
index df02cb3..2fd99d9 100644
--- a/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollectorEarlyTermination.java
+++ b/lucene/core/src/test/org/apache/lucene/search/TestTopFieldCollectorEarlyTermination.java
@@ -138,9 +138,8 @@ public class TestTopFieldCollectorEarlyTermination extends LuceneTestCase {
         }
         final boolean fillFields = random().nextBoolean();
         final boolean trackDocScores = random().nextBoolean();
-        final boolean trackMaxScore = random().nextBoolean();
-        final TopFieldCollector collector1 = TopFieldCollector.create(sort, numHits, after, fillFields, trackDocScores, trackMaxScore, true);
-        final TopFieldCollector collector2 = TopFieldCollector.create(sort, numHits, after, fillFields, trackDocScores, trackMaxScore, false);
+        final TopFieldCollector collector1 = TopFieldCollector.create(sort, numHits, after, fillFields, trackDocScores, true);
+        final TopFieldCollector collector2 = TopFieldCollector.create(sort, numHits, after, fillFields, trackDocScores, false);
 
         final Query query;
         if (random().nextBoolean()) {
@@ -154,7 +153,7 @@ public class TestTopFieldCollectorEarlyTermination extends LuceneTestCase {
         TopDocs td2 = collector2.topDocs();
 
         assertFalse(collector1.isEarlyTerminated());
-        if (trackMaxScore == false && paging == false && maxSegmentSize > numHits && query instanceof MatchAllDocsQuery) {
+        if (paging == false && maxSegmentSize > numHits && query instanceof MatchAllDocsQuery) {
           // Make sure that we sometimes early terminate
           assertTrue(collector2.isEarlyTerminated());
         }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/expressions/src/test/org/apache/lucene/expressions/TestDemoExpressions.java
----------------------------------------------------------------------
diff --git a/lucene/expressions/src/test/org/apache/lucene/expressions/TestDemoExpressions.java b/lucene/expressions/src/test/org/apache/lucene/expressions/TestDemoExpressions.java
index b84b7ad..5edd3ee 100644
--- a/lucene/expressions/src/test/org/apache/lucene/expressions/TestDemoExpressions.java
+++ b/lucene/expressions/src/test/org/apache/lucene/expressions/TestDemoExpressions.java
@@ -114,7 +114,7 @@ public class  TestDemoExpressions extends LuceneTestCase {
     
     Sort sort = new Sort(expr.getSortField(bindings, true));
     Query query = new TermQuery(new Term("body", "contents"));
-    TopFieldDocs td = searcher.search(query, 3, sort, true, true);
+    TopFieldDocs td = searcher.search(query, 3, sort, true);
     for (int i = 0; i < 3; i++) {
       FieldDoc d = (FieldDoc) td.scoreDocs[i];
       float expected = (float) Math.sqrt(d.score);
@@ -132,7 +132,7 @@ public class  TestDemoExpressions extends LuceneTestCase {
     
     Sort sort = new Sort(expr.getSortField(bindings, true));
     Query query = new TermQuery(new Term("body", "contents"));
-    TopFieldDocs td = searcher.search(query, 3, sort, true, true);
+    TopFieldDocs td = searcher.search(query, 3, sort, true);
     for (int i = 0; i < 3; i++) {
       FieldDoc d = (FieldDoc) td.scoreDocs[i];
       float expected = 2*d.score;
@@ -151,7 +151,7 @@ public class  TestDemoExpressions extends LuceneTestCase {
     
     Sort sort = new Sort(expr.getSortField(bindings, true));
     Query query = new TermQuery(new Term("body", "contents"));
-    TopFieldDocs td = searcher.search(query, 3, sort, true, true);
+    TopFieldDocs td = searcher.search(query, 3, sort, true);
     for (int i = 0; i < 3; i++) {
       FieldDoc d = (FieldDoc) td.scoreDocs[i];
       float expected = 2*d.score;
@@ -171,7 +171,7 @@ public class  TestDemoExpressions extends LuceneTestCase {
     
     Sort sort = new Sort(expr2.getSortField(bindings, true));
     Query query = new TermQuery(new Term("body", "contents"));
-    TopFieldDocs td = searcher.search(query, 3, sort, true, true);
+    TopFieldDocs td = searcher.search(query, 3, sort, true);
     for (int i = 0; i < 3; i++) {
       FieldDoc d = (FieldDoc) td.scoreDocs[i];
       float expected = 2*d.score;
@@ -203,7 +203,7 @@ public class  TestDemoExpressions extends LuceneTestCase {
     Expression expr = JavascriptCompiler.compile(sb.toString());
     Sort sort = new Sort(expr.getSortField(bindings, true));
     Query query = new TermQuery(new Term("body", "contents"));
-    TopFieldDocs td = searcher.search(query, 3, sort, true, true);
+    TopFieldDocs td = searcher.search(query, 3, sort, true);
     for (int i = 0; i < 3; i++) {
       FieldDoc d = (FieldDoc) td.scoreDocs[i];
       float expected = n*d.score;

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/expressions/src/test/org/apache/lucene/expressions/TestExpressionSorts.java
----------------------------------------------------------------------
diff --git a/lucene/expressions/src/test/org/apache/lucene/expressions/TestExpressionSorts.java b/lucene/expressions/src/test/org/apache/lucene/expressions/TestExpressionSorts.java
index fe5317e..e61c1a3 100644
--- a/lucene/expressions/src/test/org/apache/lucene/expressions/TestExpressionSorts.java
+++ b/lucene/expressions/src/test/org/apache/lucene/expressions/TestExpressionSorts.java
@@ -116,7 +116,7 @@ public class TestExpressionSorts extends LuceneTestCase {
 
   void assertQuery(Query query, Sort sort) throws Exception {
     int size = TestUtil.nextInt(random(), 1, searcher.getIndexReader().maxDoc() / 5);
-    TopDocs expected = searcher.search(query, size, sort, random().nextBoolean(), random().nextBoolean());
+    TopDocs expected = searcher.search(query, size, sort, random().nextBoolean());
     
     // make our actual sort, mutating original by replacing some of the 
     // sortfields with equivalent expressions
@@ -137,7 +137,7 @@ public class TestExpressionSorts extends LuceneTestCase {
     }
     
     Sort mutatedSort = new Sort(mutated);
-    TopDocs actual = searcher.search(query, size, mutatedSort, random().nextBoolean(), random().nextBoolean());
+    TopDocs actual = searcher.search(query, size, mutatedSort, random().nextBoolean());
     CheckHits.checkEqual(query, expected.scoreDocs, actual.scoreDocs);
     
     if (size < actual.totalHits) {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/facet/src/java/org/apache/lucene/facet/DrillSideways.java
----------------------------------------------------------------------
diff --git a/lucene/facet/src/java/org/apache/lucene/facet/DrillSideways.java b/lucene/facet/src/java/org/apache/lucene/facet/DrillSideways.java
index 2e6f8fa..9badc8c 100644
--- a/lucene/facet/src/java/org/apache/lucene/facet/DrillSideways.java
+++ b/lucene/facet/src/java/org/apache/lucene/facet/DrillSideways.java
@@ -223,7 +223,7 @@ public class DrillSideways {
    * drill down and sideways counts.
    */
   public DrillSidewaysResult search(DrillDownQuery query, Query filter, FieldDoc after, int topN, Sort sort,
-          boolean doDocScores, boolean doMaxScore) throws IOException {
+          boolean doDocScores) throws IOException {
     if (filter != null) {
       query = new DrillDownQuery(config, filter, query);
     }
@@ -241,7 +241,7 @@ public class DrillSideways {
 
                   @Override
                   public TopFieldCollector newCollector() throws IOException {
-                    return TopFieldCollector.create(sort, fTopN, after, true, doDocScores, doMaxScore, true);
+                    return TopFieldCollector.create(sort, fTopN, after, true, doDocScores, true);
                   }
 
                   @Override
@@ -260,7 +260,7 @@ public class DrillSideways {
       } else {
 
         final TopFieldCollector hitCollector =
-                TopFieldCollector.create(sort, fTopN, after, true, doDocScores, doMaxScore, true);
+                TopFieldCollector.create(sort, fTopN, after, true, doDocScores, true);
         DrillSidewaysResult r = search(query, hitCollector);
         return new DrillSidewaysResult(r.facets, hitCollector.topDocs());
       }

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/facet/src/java/org/apache/lucene/facet/FacetsCollector.java
----------------------------------------------------------------------
diff --git a/lucene/facet/src/java/org/apache/lucene/facet/FacetsCollector.java b/lucene/facet/src/java/org/apache/lucene/facet/FacetsCollector.java
index 370f132..8c32f8c 100644
--- a/lucene/facet/src/java/org/apache/lucene/facet/FacetsCollector.java
+++ b/lucene/facet/src/java/org/apache/lucene/facet/FacetsCollector.java
@@ -156,7 +156,7 @@ public class FacetsCollector extends SimpleCollector implements Collector {
   /** Utility method, to search and also collect all hits
    *  into the provided {@link Collector}. */
   public static TopDocs search(IndexSearcher searcher, Query q, int n, Collector fc) throws IOException {
-    return doSearch(searcher, null, q, n, null, false, false, fc);
+    return doSearch(searcher, null, q, n, null, false, fc);
   }
 
   /** Utility method, to search and also collect all hits
@@ -165,22 +165,22 @@ public class FacetsCollector extends SimpleCollector implements Collector {
     if (sort == null) {
       throw new IllegalArgumentException("sort must not be null");
     }
-    return (TopFieldDocs) doSearch(searcher, null, q, n, sort, false, false, fc);
+    return (TopFieldDocs) doSearch(searcher, null, q, n, sort, false, fc);
   }
 
   /** Utility method, to search and also collect all hits
    *  into the provided {@link Collector}. */
-  public static TopFieldDocs search(IndexSearcher searcher, Query q, int n, Sort sort, boolean doDocScores, boolean doMaxScore, Collector fc) throws IOException {
+  public static TopFieldDocs search(IndexSearcher searcher, Query q, int n, Sort sort, boolean doDocScores, Collector fc) throws IOException {
     if (sort == null) {
       throw new IllegalArgumentException("sort must not be null");
     }
-    return (TopFieldDocs) doSearch(searcher, null, q, n, sort, doDocScores, doMaxScore, fc);
+    return (TopFieldDocs) doSearch(searcher, null, q, n, sort, doDocScores, fc);
   }
 
   /** Utility method, to search and also collect all hits
    *  into the provided {@link Collector}. */
   public static TopDocs searchAfter(IndexSearcher searcher, ScoreDoc after, Query q, int n, Collector fc) throws IOException {
-    return doSearch(searcher, after, q, n, null, false, false, fc);
+    return doSearch(searcher, after, q, n, null, false, fc);
   }
 
   /** Utility method, to search and also collect all hits
@@ -189,20 +189,20 @@ public class FacetsCollector extends SimpleCollector implements Collector {
     if (sort == null) {
       throw new IllegalArgumentException("sort must not be null");
     }
-    return doSearch(searcher, after, q, n, sort, false, false, fc);
+    return doSearch(searcher, after, q, n, sort, false, fc);
   }
 
   /** Utility method, to search and also collect all hits
    *  into the provided {@link Collector}. */
-  public static TopDocs searchAfter(IndexSearcher searcher, ScoreDoc after, Query q, int n, Sort sort, boolean doDocScores, boolean doMaxScore, Collector fc) throws IOException {
+  public static TopDocs searchAfter(IndexSearcher searcher, ScoreDoc after, Query q, int n, Sort sort, boolean doDocScores, Collector fc) throws IOException {
     if (sort == null) {
       throw new IllegalArgumentException("sort must not be null");
     }
-    return doSearch(searcher, after, q, n, sort, doDocScores, doMaxScore, fc);
+    return doSearch(searcher, after, q, n, sort, doDocScores, fc);
   }
 
   private static TopDocs doSearch(IndexSearcher searcher, ScoreDoc after, Query q, int n, Sort sort,
-                                  boolean doDocScores, boolean doMaxScore, Collector fc) throws IOException {
+                                  boolean doDocScores, Collector fc) throws IOException {
 
     int limit = searcher.getIndexReader().maxDoc();
     if (limit == 0) {
@@ -219,7 +219,7 @@ public class FacetsCollector extends SimpleCollector implements Collector {
     if (n==0) {
       TotalHitCountCollector totalHitCountCollector = new TotalHitCountCollector();
       searcher.search(q, MultiCollector.wrap(totalHitCountCollector, fc));
-      topDocs = new TopDocs(totalHitCountCollector.getTotalHits(), new ScoreDoc[0], Float.NaN);
+      topDocs = new TopDocs(totalHitCountCollector.getTotalHits(), new ScoreDoc[0]);
     } else {
       TopDocsCollector<?> hitsCollector;
       if (sort != null) {
@@ -233,7 +233,6 @@ public class FacetsCollector extends SimpleCollector implements Collector {
                                                  (FieldDoc) after,
                                                  fillFields,
                                                  doDocScores,
-                                                 doMaxScore,
                                                  true); // TODO: can we disable exact hit counts
       } else {
         hitsCollector = TopScoreDocCollector.create(n, after, true);

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/facet/src/test/org/apache/lucene/facet/TestDrillSideways.java
----------------------------------------------------------------------
diff --git a/lucene/facet/src/test/org/apache/lucene/facet/TestDrillSideways.java b/lucene/facet/src/test/org/apache/lucene/facet/TestDrillSideways.java
index c632f3a..45a0aa2 100644
--- a/lucene/facet/src/test/org/apache/lucene/facet/TestDrillSideways.java
+++ b/lucene/facet/src/test/org/apache/lucene/facet/TestDrillSideways.java
@@ -813,7 +813,7 @@ public class TestDrillSideways extends FacetTestCase {
       }
 
       // Retrieve all facets:
-      DrillSidewaysResult actual = ds.search(ddq, filter, null, numDocs, sort, true, true);
+      DrillSidewaysResult actual = ds.search(ddq, filter, null, numDocs, sort, true);
 
       TopDocs hits = s.search(baseQuery, numDocs);
       Map<String, Float> scores = new HashMap<>();
@@ -1145,8 +1145,7 @@ public class TestDrillSideways extends FacetTestCase {
     DrillSidewaysResult r = ds.search(ddq, 10); // this used to fail on IllegalArgEx
     assertEquals(0, r.hits.totalHits);
 
-    r = ds.search(ddq, null, null, 10, new Sort(new SortField("foo", SortField.Type.INT)), false,
-            false); // this used to fail on IllegalArgEx
+    r = ds.search(ddq, null, null, 10, new Sort(new SortField("foo", SortField.Type.INT)), false); // this used to fail on IllegalArgEx
     assertEquals(0, r.hits.totalHits);
 
     writer.close();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/TestTaxonomyFacetSumValueSource.java
----------------------------------------------------------------------
diff --git a/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/TestTaxonomyFacetSumValueSource.java b/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/TestTaxonomyFacetSumValueSource.java
index 2af9925..5bc8472 100644
--- a/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/TestTaxonomyFacetSumValueSource.java
+++ b/lucene/facet/src/test/org/apache/lucene/facet/taxonomy/TestTaxonomyFacetSumValueSource.java
@@ -261,7 +261,7 @@ public class TestTaxonomyFacetSumValueSource extends FacetTestCase {
 
     Facets facets = new TaxonomyFacetSumValueSource(taxoReader, config, fc, DoubleValuesSource.SCORES);
     
-    int expected = (int) (td.getMaxScore() * td.totalHits);
+    int expected = (int) (csq.getBoost() * td.totalHits);
     assertEquals(expected, facets.getSpecificValue("dim", "a").intValue());
 
     iw.close();

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/grouping/src/java/org/apache/lucene/search/grouping/BlockGroupingCollector.java
----------------------------------------------------------------------
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/BlockGroupingCollector.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/BlockGroupingCollector.java
index d915eb9..f627adf 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/BlockGroupingCollector.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/BlockGroupingCollector.java
@@ -306,9 +306,10 @@ public class BlockGroupingCollector extends SimpleCollector {
         collector = TopScoreDocCollector.create(maxDocsPerGroup);
       } else {
         // Sort by fields
-        collector = TopFieldCollector.create(withinGroupSort, maxDocsPerGroup, fillSortFields, needsScores, needsScores, true); // TODO: disable exact counts?
+        collector = TopFieldCollector.create(withinGroupSort, maxDocsPerGroup, fillSortFields, needsScores, true); // TODO: disable exact counts?
       }
 
+      float groupMaxScore = needsScores ? Float.NEGATIVE_INFINITY : Float.NaN;
       LeafCollector leafCollector = collector.getLeafCollector(og.readerContext);
       leafCollector.setScorer(fakeScorer);
       for(int docIDX=0;docIDX<og.count;docIDX++) {
@@ -316,6 +317,7 @@ public class BlockGroupingCollector extends SimpleCollector {
         fakeScorer.doc = doc;
         if (needsScores) {
           fakeScorer.score = og.scores[docIDX];
+          groupMaxScore = Math.max(groupMaxScore, fakeScorer.score);
         }
         leafCollector.collect(doc);
       }
@@ -337,12 +339,12 @@ public class BlockGroupingCollector extends SimpleCollector {
       // TODO: we could aggregate scores across children
       // by Sum/Avg instead of passing NaN:
       groups[downTo] = new GroupDocs<>(Float.NaN,
-                                             topDocs.getMaxScore(),
+                                             groupMaxScore,
                                              og.count,
                                              topDocs.scoreDocs,
                                              null,
                                              groupSortValues);
-      maxScore = Math.max(maxScore, topDocs.getMaxScore());
+      maxScore = Math.max(maxScore, groupMaxScore);
     }
 
     /*

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/331ccf39/lucene/grouping/src/java/org/apache/lucene/search/grouping/TopGroups.java
----------------------------------------------------------------------
diff --git a/lucene/grouping/src/java/org/apache/lucene/search/grouping/TopGroups.java b/lucene/grouping/src/java/org/apache/lucene/search/grouping/TopGroups.java
index 36ab8d9..c87dd0d 100644
--- a/lucene/grouping/src/java/org/apache/lucene/search/grouping/TopGroups.java
+++ b/lucene/grouping/src/java/org/apache/lucene/search/grouping/TopGroups.java
@@ -161,13 +161,11 @@ public class TopGroups<T> {
 
         if (docSort.equals(Sort.RELEVANCE)) {
           shardTopDocs[shardIDX] = new TopDocs(shardGroupDocs.totalHits,
-                                               shardGroupDocs.scoreDocs,
-                                               shardGroupDocs.maxScore);
+                                               shardGroupDocs.scoreDocs);
         } else {
           shardTopDocs[shardIDX] = new TopFieldDocs(shardGroupDocs.totalHits,
               shardGroupDocs.scoreDocs,
-              docSort.getSort(),
-              shardGroupDocs.maxScore);
+              docSort.getSort());
         }
         maxScore = Math.max(maxScore, shardGroupDocs.maxScore);
         totalHits += shardGroupDocs.totalHits;