Index: lucene/core/src/test/org/apache/lucene/search/TestSort.java
===================================================================
--- lucene/core/src/test/org/apache/lucene/search/TestSort.java	(révision 1466648)
+++ lucene/core/src/test/org/apache/lucene/search/TestSort.java	(copie de travail)
@@ -35,6 +35,7 @@
 import org.apache.lucene.index.Term;
 import org.apache.lucene.index.Terms;
 import org.apache.lucene.index.TermsEnum;
+import org.apache.lucene.search.BooleanClause.Occur;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.LuceneTestCase;
@@ -1516,4 +1517,31 @@
     ir.close();
     dir.close();
   }
+
+  public void testScore() throws IOException {
+    Directory dir = newDirectory();
+    RandomIndexWriter writer = new RandomIndexWriter(random(), dir);
+    Document doc = new Document();
+    doc.add(newStringField("value", "bar", Field.Store.NO));
+    writer.addDocument(doc);
+    doc = new Document();
+    doc.add(newStringField("value", "foo", Field.Store.NO));
+    writer.addDocument(doc);
+    IndexReader ir = writer.getReader();
+    writer.close();
+
+    IndexSearcher searcher = newSearcher(ir);
+    Sort sort = new Sort(SortField.FIELD_SCORE);
+
+    final BooleanQuery bq = new BooleanQuery();
+    bq.add(new TermQuery(new Term("value", "foo")), Occur.SHOULD);
+    bq.add(new MatchAllDocsQuery(), Occur.SHOULD);
+    TopDocs td = searcher.search(bq, 10, sort);
+    assertEquals(2, td.totalHits);
+    assertEquals(1, td.scoreDocs[0].doc);
+    assertEquals(0, td.scoreDocs[1].doc);
+
+    ir.close();
+    dir.close();
+  }
 }
Index: lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java	(révision 1466648)
+++ lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java	(copie de travail)
@@ -804,7 +804,7 @@
     public TopFieldDocs call() throws IOException {
       assert slice.leaves.length == 1;
       final TopFieldDocs docs = searcher.search(Arrays.asList(slice.leaves),
-          weight, after, nDocs, sort, true, doDocScores, doMaxScore);
+          weight, after, nDocs, sort, true, doDocScores || sort.needsScores(), doMaxScore);
       lock.lock();
       try {
         final AtomicReaderContext ctx = slice.leaves[0];
Index: lucene/core/src/java/org/apache/lucene/search/Sort.java
===================================================================
--- lucene/core/src/java/org/apache/lucene/search/Sort.java	(révision 1466648)
+++ lucene/core/src/java/org/apache/lucene/search/Sort.java	(copie de travail)
@@ -201,4 +201,15 @@
   public int hashCode() {
     return 0x45aaf665 + Arrays.hashCode(fields);
   }
+
+  /** Whether the relevance score is needed to sort documents. */
+  boolean needsScores() {
+    for (SortField sortField : fields) {
+      if (sortField.getType() == SortField.Type.SCORE) {
+        return true;
+      }
+    }
+    return false;
+  }
+
 }
