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 2015/01/12 23:59:16 UTC

svn commit: r1651224 - in /lucene/dev/trunk/lucene: CHANGES.txt core/src/java/org/apache/lucene/search/BooleanQuery.java core/src/test/org/apache/lucene/search/TestBooleanScorer.java

Author: rmuir
Date: Mon Jan 12 22:59:16 2015
New Revision: 1651224

URL: http://svn.apache.org/r1651224
Log:
LUCENE-6178: don't score MUST_NOT clauses with BooleanScorer

Modified:
    lucene/dev/trunk/lucene/CHANGES.txt
    lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/BooleanQuery.java
    lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestBooleanScorer.java

Modified: lucene/dev/trunk/lucene/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/CHANGES.txt?rev=1651224&r1=1651223&r2=1651224&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/CHANGES.txt (original)
+++ lucene/dev/trunk/lucene/CHANGES.txt Mon Jan 12 22:59:16 2015
@@ -199,6 +199,9 @@ Optimizations
 * LUCENE-6145: Make EarlyTerminatingSortingCollector able to early-terminate
   when the sort order is a prefix of the index-time order. (Adrien Grand)
 
+* LUCENE-6178: Score boolean queries containing MUST_NOT clauses with BooleanScorer2,
+  to use skip list data and avoid unnecessary scoring. (Adrien Grand, Robert Muir)
+
 API Changes
 
 * LUCENE-5900: Deprecated more constructors taking Version in *InfixSuggester and

Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/BooleanQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/BooleanQuery.java?rev=1651224&r1=1651223&r2=1651224&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/BooleanQuery.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/BooleanQuery.java Mon Jan 12 22:59:16 2015
@@ -330,7 +330,8 @@ public class BooleanQuery extends Query
           // BooleanScorer2...
           return super.bulkScorer(context, scoreDocsInOrder, acceptDocs);
         } else if (c.isProhibited()) {
-          prohibited.add(subScorer);
+          // TODO: there are some cases where BooleanScorer could do this faster
+          return super.bulkScorer(context, scoreDocsInOrder, acceptDocs);
         } else {
           optional.add(subScorer);
         }

Modified: lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestBooleanScorer.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestBooleanScorer.java?rev=1651224&r1=1651223&r2=1651224&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestBooleanScorer.java (original)
+++ lucene/dev/trunk/lucene/core/src/test/org/apache/lucene/search/TestBooleanScorer.java Mon Jan 12 22:59:16 2015
@@ -25,7 +25,6 @@ import java.util.List;
 
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field;
-import org.apache.lucene.document.TextField;
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.IndexReader;
 import org.apache.lucene.index.RandomIndexWriter;
@@ -127,55 +126,6 @@ public class TestBooleanScorer extends L
     directory.close();
   }
 
-  public void testMoreThan32ProhibitedClauses() throws Exception {
-    final Directory d = newDirectory();
-    final RandomIndexWriter w = new RandomIndexWriter(random(), d);
-    Document doc = new Document();
-    doc.add(new TextField("field", "0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33", Field.Store.NO));
-    w.addDocument(doc);
-    doc = new Document();
-    doc.add(new TextField("field", "33", Field.Store.NO));
-    w.addDocument(doc);
-    final IndexReader r = w.getReader();
-    w.close();
-    // we don't wrap with AssertingIndexSearcher in order to have the original scorer in setScorer.
-    final IndexSearcher s = newSearcher(r, true, false);
-
-    final BooleanQuery q = new BooleanQuery();
-    for(int term=0;term<33;term++) {
-      q.add(new BooleanClause(new TermQuery(new Term("field", ""+term)),
-                              BooleanClause.Occur.MUST_NOT));
-    }
-    q.add(new BooleanClause(new TermQuery(new Term("field", "33")),
-                            BooleanClause.Occur.SHOULD));
-                            
-    final int[] count = new int[1];
-    s.search(q, new SimpleCollector() {
-    
-      @Override
-      public void setScorer(Scorer scorer) {
-        // Make sure we got BooleanScorer:
-        final Class<?> clazz = scorer.getClass();
-        assertEquals("Scorer is implemented by wrong class", FakeScorer.class.getName(), clazz.getName());
-      }
-      
-      @Override
-      public void collect(int doc) {
-        count[0]++;
-      }
-      
-      @Override
-      public boolean acceptsDocsOutOfOrder() {
-        return true;
-      }
-    });
-
-    assertEquals(1, count[0]);
-    
-    r.close();
-    d.close();
-  }
-
   /** Throws UOE if Weight.scorer is called */
   private static class CrazyMustUseBulkScorerQuery extends Query {