You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2011/10/11 10:45:14 UTC

svn commit: r1181662 - in /lucene/dev/branches/branch_3x: ./ lucene/ lucene/CHANGES.txt lucene/backwards/src/test/ lucene/src/java/org/apache/lucene/search/DisjunctionSumScorer.java lucene/src/test/org/apache/lucene/search/TestBooleanQuery.java solr/

Author: rmuir
Date: Tue Oct 11 08:45:14 2011
New Revision: 1181662

URL: http://svn.apache.org/viewvc?rev=1181662&view=rev
Log:
LUCENE-3503: DisjunctionSumScorer gives slightly different scores when you nextDoc vs advance

Modified:
    lucene/dev/branches/branch_3x/   (props changed)
    lucene/dev/branches/branch_3x/lucene/   (props changed)
    lucene/dev/branches/branch_3x/lucene/CHANGES.txt
    lucene/dev/branches/branch_3x/lucene/backwards/src/test/   (props changed)
    lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/DisjunctionSumScorer.java
    lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/search/TestBooleanQuery.java
    lucene/dev/branches/branch_3x/solr/   (props changed)

Modified: lucene/dev/branches/branch_3x/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/CHANGES.txt?rev=1181662&r1=1181661&r2=1181662&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/CHANGES.txt (original)
+++ lucene/dev/branches/branch_3x/lucene/CHANGES.txt Tue Oct 11 08:45:14 2011
@@ -60,6 +60,10 @@ Bug fixes
   for docBase to Collector.setNextReader.  (Robert Muir, Mike
   McCandless)
 
+* LUCENE-3503: DisjunctionSumScorer would give slightly different scores
+  for a document depending if you used nextDoc() versus advance().
+  (Mike McCandless, Robert Muir)
+
 New Features
 
 * LUCENE-3448: Added FixedBitSet.and(other/DISI), andNot(other/DISI).

Modified: lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/DisjunctionSumScorer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/DisjunctionSumScorer.java?rev=1181662&r1=1181661&r2=1181662&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/DisjunctionSumScorer.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/java/org/apache/lucene/search/DisjunctionSumScorer.java Tue Oct 11 08:45:14 2011
@@ -55,7 +55,7 @@ class DisjunctionSumScorer extends Score
   /** The number of subscorers that provide the current match. */
   protected int nrMatchers = -1;
 
-  private float currentScore = Float.NaN;
+  private double currentScore = Float.NaN;
   
   /** Construct a <code>DisjunctionScorer</code>.
    * @param weight The weight to be used.
@@ -192,7 +192,7 @@ class DisjunctionSumScorer extends Score
    * Initially invalid, until {@link #nextDoc()} is called the first time.
    */
   @Override
-  public float score() throws IOException { return currentScore; }
+  public float score() throws IOException { return (float)currentScore; }
    
   @Override
   public int docID() {

Modified: lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/search/TestBooleanQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/search/TestBooleanQuery.java?rev=1181662&r1=1181661&r2=1181662&view=diff
==============================================================================
--- lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/search/TestBooleanQuery.java (original)
+++ lucene/dev/branches/branch_3x/lucene/src/test/org/apache/lucene/search/TestBooleanQuery.java Tue Oct 11 08:45:14 2011
@@ -17,6 +17,9 @@ package org.apache.lucene.search;
  * limitations under the License.
  */
 
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
@@ -32,6 +35,7 @@ import org.apache.lucene.index.Term;
 import org.apache.lucene.queryParser.QueryParser;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.util.LuceneTestCase;
+import org.apache.lucene.util._TestUtil;
 
 public class TestBooleanQuery extends LuceneTestCase {
   
@@ -155,4 +159,113 @@ public class TestBooleanQuery extends Lu
     dir1.close();
     dir2.close();
   }
+
+  public void testBS2DisjunctionNextVsAdvance() throws Exception {
+    final Directory d = newDirectory();
+    final RandomIndexWriter w = new RandomIndexWriter(random, d);
+    final int numDocs = atLeast(300);
+    for(int docUpto=0;docUpto<numDocs;docUpto++) {
+      String contents = "a";
+      if (random.nextInt(20) <= 16) {
+        contents += " b";
+      }
+      if (random.nextInt(20) <= 8) {
+        contents += " c";
+      }
+      if (random.nextInt(20) <= 4) {
+        contents += " d";
+      }
+      if (random.nextInt(20) <= 2) {
+        contents += " e";
+      }
+      if (random.nextInt(20) <= 1) {
+        contents += " f";
+      }
+      Document doc = new Document();
+      doc.add(new Field("field", contents, Field.Store.NO, Field.Index.ANALYZED));
+      w.addDocument(doc);
+    }
+    w.optimize();
+    final IndexReader r = w.getReader();
+    final IndexSearcher s = newSearcher(r);
+    w.close();
+
+    for(int iter=0;iter<10*RANDOM_MULTIPLIER;iter++) {
+      if (VERBOSE) {
+        System.out.println("iter=" + iter);
+      }
+      final List<String> terms = new ArrayList<String>(Arrays.asList("a", "b", "c", "d", "e", "f"));
+      final int numTerms = _TestUtil.nextInt(random, 1, terms.size());
+      while(terms.size() > numTerms) {
+        terms.remove(random.nextInt(terms.size()));
+      }
+
+      if (VERBOSE) {
+        System.out.println("  terms=" + terms);
+      }
+
+      final BooleanQuery q = new BooleanQuery();
+      for(String term : terms) {
+        q.add(new BooleanClause(new TermQuery(new Term("field", term)), BooleanClause.Occur.SHOULD));
+      }
+
+      Weight weight = s.createNormalizedWeight(q);
+
+      Scorer scorer = weight.scorer(s.subReaders[0],
+                                          true, false);
+
+      // First pass: just use .nextDoc() to gather all hits
+      final List<ScoreDoc> hits = new ArrayList<ScoreDoc>();
+      while(scorer.nextDoc() != DocIdSetIterator.NO_MORE_DOCS) {
+        hits.add(new ScoreDoc(scorer.docID(), scorer.score()));
+      }
+
+      if (VERBOSE) {
+        System.out.println("  " + hits.size() + " hits");
+      }
+
+      // Now, randomly next/advance through the list and
+      // verify exact match:
+      for(int iter2=0;iter2<10;iter2++) {
+
+        weight = s.createNormalizedWeight(q);
+        scorer = weight.scorer(s.subReaders[0],
+                               true, false);
+
+        if (VERBOSE) {
+          System.out.println("  iter2=" + iter2);
+        }
+
+        int upto = -1;
+        while(upto < hits.size()) {
+          final int nextUpto;
+          final int nextDoc;
+          final int left = hits.size() - upto;
+          if (left == 1 || random.nextBoolean()) {
+            // next
+            nextUpto = 1+upto;
+            nextDoc = scorer.nextDoc();
+          } else {
+            // advance
+            int inc = _TestUtil.nextInt(random, 1, left-1);
+            nextUpto = inc + upto;
+            nextDoc = scorer.advance(hits.get(nextUpto).doc);
+          }
+
+          if (nextUpto == hits.size()) {
+            assertEquals(DocIdSetIterator.NO_MORE_DOCS, nextDoc);
+          } else {
+            final ScoreDoc hit = hits.get(nextUpto);
+            assertEquals(hit.doc, nextDoc);
+            // Test for precise float equality:
+            assertTrue("doc " + hit.doc + " has wrong score: expected=" + hit.score + " actual=" + scorer.score(), hit.score == scorer.score());
+          }
+          upto = nextUpto;
+        }
+      }
+    }
+    
+    r.close();
+    d.close();
+  }
 }