You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jp...@apache.org on 2015/05/21 16:51:50 UTC
svn commit: r1680893 -
/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/MultiTermQueryConstantScoreWrapper.java
Author: jpountz
Date: Thu May 21 14:51:49 2015
New Revision: 1680893
URL: http://svn.apache.org/r1680893
Log:
LUCENE-6458: Propagate the bulk scorer too.
Modified:
lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/MultiTermQueryConstantScoreWrapper.java
Modified: lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/MultiTermQueryConstantScoreWrapper.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/MultiTermQueryConstantScoreWrapper.java?rev=1680893&r1=1680892&r2=1680893&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/MultiTermQueryConstantScoreWrapper.java (original)
+++ lucene/dev/trunk/lucene/core/src/java/org/apache/lucene/search/MultiTermQueryConstantScoreWrapper.java Thu May 21 14:51:49 2015
@@ -20,6 +20,7 @@ package org.apache.lucene.search;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
import org.apache.lucene.index.LeafReaderContext;
import org.apache.lucene.index.PostingsEnum;
@@ -60,6 +61,21 @@ final class MultiTermQueryConstantScoreW
}
}
+ private static class WeightOrBitSet {
+ final Weight weight;
+ final BitDocIdSet bitset;
+
+ WeightOrBitSet(Weight weight) {
+ this.weight = Objects.requireNonNull(weight);
+ this.bitset = null;
+ }
+
+ WeightOrBitSet(BitDocIdSet bitset) {
+ this.bitset = bitset;
+ this.weight = null;
+ }
+ }
+
protected final Q query;
/**
@@ -116,18 +132,20 @@ final class MultiTermQueryConstantScoreW
return termsEnum.next() == null;
}
- @Override
- public Scorer scorer(LeafReaderContext context, Bits acceptDocs) throws IOException {
+ /**
+ * On the given leaf context, try to either rewrite to a disjunction if
+ * there are few terms, or build a bitset containing matching docs.
+ */
+ private WeightOrBitSet rewrite(LeafReaderContext context, Bits acceptDocs) throws IOException {
final Terms terms = context.reader().terms(query.field);
if (terms == null) {
// field does not exist
- return null;
+ return new WeightOrBitSet((BitDocIdSet) null);
}
final TermsEnum termsEnum = query.getTermsEnum(terms);
assert termsEnum != null;
- BitDocIdSet.Builder builder = new BitDocIdSet.Builder(context.reader().maxDoc());
PostingsEnum docs = null;
final List<TermAndState> collectedTerms = new ArrayList<>();
@@ -141,10 +159,11 @@ final class MultiTermQueryConstantScoreW
}
Query q = new ConstantScoreQuery(bq);
q.setBoost(score());
- return searcher.rewrite(q).createWeight(searcher, needsScores).scorer(context, acceptDocs);
+ return new WeightOrBitSet(searcher.rewrite(q).createWeight(searcher, needsScores));
}
// Too many terms: go back to the terms we already collected and start building the bit set
+ BitDocIdSet.Builder builder = new BitDocIdSet.Builder(context.reader().maxDoc());
if (collectedTerms.isEmpty() == false) {
TermsEnum termsEnum2 = terms.iterator();
for (TermAndState t : collectedTerms) {
@@ -160,7 +179,10 @@ final class MultiTermQueryConstantScoreW
builder.or(docs);
} while (termsEnum.next() != null);
- final BitDocIdSet set = builder.build();
+ return new WeightOrBitSet(builder.build());
+ }
+
+ private Scorer scorer(BitDocIdSet set) {
if (set == null) {
return null;
}
@@ -170,6 +192,30 @@ final class MultiTermQueryConstantScoreW
}
return new ConstantScoreScorer(this, score(), disi);
}
+
+ @Override
+ public BulkScorer bulkScorer(LeafReaderContext context, Bits acceptDocs) throws IOException {
+ final WeightOrBitSet weightOrBitSet = rewrite(context, acceptDocs);
+ if (weightOrBitSet.weight != null) {
+ return weightOrBitSet.weight.bulkScorer(context, acceptDocs);
+ } else {
+ final Scorer scorer = scorer(weightOrBitSet.bitset);
+ if (scorer == null) {
+ return null;
+ }
+ return new DefaultBulkScorer(scorer);
+ }
+ }
+
+ @Override
+ public Scorer scorer(LeafReaderContext context, Bits acceptDocs) throws IOException {
+ final WeightOrBitSet weightOrBitSet = rewrite(context, acceptDocs);
+ if (weightOrBitSet.weight != null) {
+ return weightOrBitSet.weight.scorer(context, acceptDocs);
+ } else {
+ return scorer(weightOrBitSet.bitset);
+ }
+ }
};
}
}