You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by mi...@apache.org on 2014/03/10 20:54:02 UTC
svn commit: r1576066 - in /lucene/dev/branches/lucene5487/lucene/core/src:
java/org/apache/lucene/search/ test/org/apache/lucene/search/
Author: mikemccand
Date: Mon Mar 10 19:54:01 2014
New Revision: 1576066
URL: http://svn.apache.org/r1576066
Log:
LUCENE-5487: add feedback from Rob
Modified:
lucene/dev/branches/lucene5487/lucene/core/src/java/org/apache/lucene/search/BooleanQuery.java
lucene/dev/branches/lucene5487/lucene/core/src/java/org/apache/lucene/search/FilteredQuery.java
lucene/dev/branches/lucene5487/lucene/core/src/java/org/apache/lucene/search/Weight.java
lucene/dev/branches/lucene5487/lucene/core/src/test/org/apache/lucene/search/TestBooleanQuery.java
Modified: lucene/dev/branches/lucene5487/lucene/core/src/java/org/apache/lucene/search/BooleanQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5487/lucene/core/src/java/org/apache/lucene/search/BooleanQuery.java?rev=1576066&r1=1576065&r2=1576066&view=diff
==============================================================================
--- lucene/dev/branches/lucene5487/lucene/core/src/java/org/apache/lucene/search/BooleanQuery.java (original)
+++ lucene/dev/branches/lucene5487/lucene/core/src/java/org/apache/lucene/search/BooleanQuery.java Mon Mar 10 19:54:01 2014
@@ -306,7 +306,7 @@ public class BooleanQuery extends Query
@Override
public BulkScorer bulkScorer(AtomicReaderContext context, boolean scoreDocsInOrder,
- Bits acceptDocs) throws IOException {
+ Bits acceptDocs) throws IOException {
if (scoreDocsInOrder || minNrShouldMatch > 1) {
// TODO: (LUCENE-4872) in some cases BooleanScorer may be faster for minNrShouldMatch
@@ -394,9 +394,14 @@ public class BooleanQuery extends Query
@Override
public boolean scoresDocsOutOfOrder() {
+ if (minNrShouldMatch > 1) {
+ // BS2 (in-order) will be used by scorer()
+ return false;
+ }
for (BooleanClause c : clauses) {
if (c.isRequired()) {
- return false; // BS2 (in-order) will be used by scorer()
+ // BS2 (in-order) will be used by scorer()
+ return false;
}
}
Modified: lucene/dev/branches/lucene5487/lucene/core/src/java/org/apache/lucene/search/FilteredQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5487/lucene/core/src/java/org/apache/lucene/search/FilteredQuery.java?rev=1576066&r1=1576065&r2=1576066&view=diff
==============================================================================
--- lucene/dev/branches/lucene5487/lucene/core/src/java/org/apache/lucene/search/FilteredQuery.java (original)
+++ lucene/dev/branches/lucene5487/lucene/core/src/java/org/apache/lucene/search/FilteredQuery.java Mon Mar 10 19:54:01 2014
@@ -323,48 +323,6 @@ public class FilteredQuery extends Query
return Math.min(primary.cost(), secondary.cost());
}
}
-
- private static final class LeapFrogBulkScorer extends BulkScorer {
- private final DocIdSetIterator primary;
- private final DocIdSetIterator secondary;
- private final Scorer scorer;
-
- public LeapFrogBulkScorer(DocIdSetIterator primary, DocIdSetIterator secondary, Scorer scorer) {
- this.primary = primary;
- this.secondary = secondary;
- this.scorer = scorer;
- }
-
- @Override
- public boolean score(Collector collector, int maxDoc) throws IOException {
- // the normalization trick already applies the boost of this query,
- // so we can use the wrapped scorer directly:
- collector.setScorer(scorer);
- int primDoc, secDoc;
- if (primary.docID() == -1) {
- primDoc = primary.nextDoc();
- secDoc = secondary.advance(primDoc);
- } else {
- primDoc = primary.docID();
- secDoc = secondary.docID();
- }
- for (;;) {
- if (primDoc == secDoc) {
- // Check if scorer has exhausted, only before collecting.
- if (primDoc >= maxDoc) {
- return primDoc < Scorer.NO_MORE_DOCS;
- }
- collector.collect(primDoc);
- primDoc = primary.nextDoc();
- secDoc = secondary.advance(primDoc);
- } else if (secDoc > primDoc) {
- primDoc = primary.advance(secDoc);
- } else {
- secDoc = secondary.advance(primDoc);
- }
- }
- }
- }
// TODO once we have way to figure out if we use RA or LeapFrog we can remove this scorer
private static final class PrimaryAdvancedLeapFrogScorer extends LeapFrogScorer {
@@ -638,26 +596,6 @@ public class FilteredQuery extends Query
return new LeapFrogScorer(weight, filterIter, scorer, scorer);
}
}
-
- @Override
- public BulkScorer filteredBulkScorer(AtomicReaderContext context,
- Weight weight, boolean scoreDocsInOrder, DocIdSet docIdSet) throws IOException {
- final DocIdSetIterator filterIter = docIdSet.iterator();
- if (filterIter == null) {
- // this means the filter does not accept any documents.
- return null;
- }
- // we pass null as acceptDocs, as our filter has already respected acceptDocs, no need to do twice
- final Scorer scorer = weight.scorer(context, null);
- if (scorer == null) {
- return null;
- }
- if (scorerFirst) {
- return new LeapFrogBulkScorer(scorer, filterIter, scorer);
- } else {
- return new LeapFrogBulkScorer(filterIter, scorer, scorer);
- }
- }
}
/**
Modified: lucene/dev/branches/lucene5487/lucene/core/src/java/org/apache/lucene/search/Weight.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5487/lucene/core/src/java/org/apache/lucene/search/Weight.java?rev=1576066&r1=1576065&r2=1576066&view=diff
==============================================================================
--- lucene/dev/branches/lucene5487/lucene/core/src/java/org/apache/lucene/search/Weight.java (original)
+++ lucene/dev/branches/lucene5487/lucene/core/src/java/org/apache/lucene/search/Weight.java Mon Mar 10 19:54:01 2014
@@ -173,12 +173,14 @@ public abstract class Weight {
* Returns true iff this implementation scores docs only out of order. This
* method is used in conjunction with {@link Collector}'s
* {@link Collector#acceptsDocsOutOfOrder() acceptsDocsOutOfOrder} and
- * {@link #scorer(AtomicReaderContext, Bits)} to
+ * {@link #bulkScorer(AtomicReaderContext, boolean, Bits)} to
* create a matching {@link Scorer} instance for a given {@link Collector}, or
* vice versa.
* <p>
* <b>NOTE:</b> the default implementation returns <code>false</code>, i.e.
* the <code>Scorer</code> scores documents in-order.
*/
- public boolean scoresDocsOutOfOrder() { return false; }
+ public boolean scoresDocsOutOfOrder() {
+ return false;
+ }
}
Modified: lucene/dev/branches/lucene5487/lucene/core/src/test/org/apache/lucene/search/TestBooleanQuery.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/lucene5487/lucene/core/src/test/org/apache/lucene/search/TestBooleanQuery.java?rev=1576066&r1=1576065&r2=1576066&view=diff
==============================================================================
--- lucene/dev/branches/lucene5487/lucene/core/src/test/org/apache/lucene/search/TestBooleanQuery.java (original)
+++ lucene/dev/branches/lucene5487/lucene/core/src/test/org/apache/lucene/search/TestBooleanQuery.java Mon Mar 10 19:54:01 2014
@@ -17,6 +17,7 @@ package org.apache.lucene.search;
* limitations under the License.
*/
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
@@ -29,6 +30,7 @@ import org.apache.lucene.analysis.MockAn
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
+import org.apache.lucene.index.AtomicReaderContext;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
@@ -43,7 +45,6 @@ import org.apache.lucene.store.Directory
import org.apache.lucene.util.LuceneTestCase;
import org.apache.lucene.util.NamedThreadFactory;
import org.apache.lucene.util.TestUtil;
-import org.apache.lucene.util.TestUtil;
public class TestBooleanQuery extends LuceneTestCase {
@@ -325,4 +326,30 @@ public class TestBooleanQuery extends Lu
directory.close();
}
+ // LUCENE-5487
+ public void testInOrderWithMinShouldMatch() throws Exception {
+ Directory dir = newDirectory();
+ RandomIndexWriter w = new RandomIndexWriter(random(), dir);
+ Document doc = new Document();
+ doc.add(newTextField("field", "some text here", Field.Store.NO));
+ w.addDocument(doc);
+ IndexReader r = w.getReader();
+ w.close();
+ IndexSearcher s = new IndexSearcher(r) {
+ @Override
+ protected void search(List<AtomicReaderContext> leaves, Weight weight, Collector collector) throws IOException {
+ assertEquals(-1, collector.getClass().getSimpleName().indexOf("OutOfOrder"));
+ super.search(leaves, weight, collector);
+ }
+ };
+ BooleanQuery bq = new BooleanQuery();
+ bq.add(new TermQuery(new Term("field", "some")), BooleanClause.Occur.SHOULD);
+ bq.add(new TermQuery(new Term("field", "text")), BooleanClause.Occur.SHOULD);
+ bq.add(new TermQuery(new Term("field", "here")), BooleanClause.Occur.SHOULD);
+ bq.setMinimumNumberShouldMatch(2);
+ s.search(bq, 10);
+ r.close();
+ dir.close();
+ }
+
}