mirror of https://github.com/apache/lucene.git
LUCENE-6309: disable coord when scores are not needed, or the scoring fn does not use it
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1662964 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
f5e8447d8c
commit
99a16fc2dc
|
@ -42,13 +42,13 @@ public class BooleanWeight extends Weight {
|
||||||
protected int maxCoord; // num optional + num required
|
protected int maxCoord; // num optional + num required
|
||||||
private final boolean disableCoord;
|
private final boolean disableCoord;
|
||||||
private final boolean needsScores;
|
private final boolean needsScores;
|
||||||
|
private final float coords[];
|
||||||
|
|
||||||
public BooleanWeight(BooleanQuery query, IndexSearcher searcher, boolean needsScores, boolean disableCoord) throws IOException {
|
public BooleanWeight(BooleanQuery query, IndexSearcher searcher, boolean needsScores, boolean disableCoord) throws IOException {
|
||||||
super(query);
|
super(query);
|
||||||
this.query = query;
|
this.query = query;
|
||||||
this.needsScores = needsScores;
|
this.needsScores = needsScores;
|
||||||
this.similarity = searcher.getSimilarity();
|
this.similarity = searcher.getSimilarity();
|
||||||
this.disableCoord = disableCoord;
|
|
||||||
weights = new ArrayList<>(query.clauses().size());
|
weights = new ArrayList<>(query.clauses().size());
|
||||||
for (int i = 0 ; i < query.clauses().size(); i++) {
|
for (int i = 0 ; i < query.clauses().size(); i++) {
|
||||||
BooleanClause c = query.clauses().get(i);
|
BooleanClause c = query.clauses().get(i);
|
||||||
|
@ -58,6 +58,23 @@ public class BooleanWeight extends Weight {
|
||||||
maxCoord++;
|
maxCoord++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// precompute coords (0..N, N).
|
||||||
|
// set disableCoord when its explicit, scores are not needed, no scoring clauses, or the sim doesn't use it.
|
||||||
|
coords = new float[maxCoord+1];
|
||||||
|
Arrays.fill(coords, 1F);
|
||||||
|
coords[0] = 0f;
|
||||||
|
if (maxCoord > 0 && needsScores && disableCoord == false) {
|
||||||
|
// compute coords from the similarity, look for any actual ones.
|
||||||
|
boolean seenActualCoord = false;
|
||||||
|
for (int i = 1; i < coords.length; i++) {
|
||||||
|
coords[i] = coord(i, maxCoord);
|
||||||
|
seenActualCoord |= (coords[i] != 1F);
|
||||||
|
}
|
||||||
|
this.disableCoord = seenActualCoord == false;
|
||||||
|
} else {
|
||||||
|
this.disableCoord = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -346,9 +363,9 @@ public class BooleanWeight extends Weight {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (minShouldMatch > 0) {
|
if (minShouldMatch > 0) {
|
||||||
return new BooleanTopLevelScorers.CoordinatingConjunctionScorer(this, coords(), req, requiredScoring.size(), opt);
|
return new BooleanTopLevelScorers.CoordinatingConjunctionScorer(this, coords, req, requiredScoring.size(), opt);
|
||||||
} else {
|
} else {
|
||||||
return new BooleanTopLevelScorers.ReqMultiOptScorer(req, opt, requiredScoring.size(), coords());
|
return new BooleanTopLevelScorers.ReqMultiOptScorer(req, opt, requiredScoring.size(), coords);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -395,10 +412,11 @@ public class BooleanWeight extends Weight {
|
||||||
} else {
|
} else {
|
||||||
float coords[];
|
float coords[];
|
||||||
if (disableCoord) {
|
if (disableCoord) {
|
||||||
|
// sneaky: when we do a mixed conjunction/disjunction, we need a fake for the disjunction part.
|
||||||
coords = new float[optional.size()+1];
|
coords = new float[optional.size()+1];
|
||||||
Arrays.fill(coords, 1F);
|
Arrays.fill(coords, 1F);
|
||||||
} else {
|
} else {
|
||||||
coords = coords();
|
coords = this.coords;
|
||||||
}
|
}
|
||||||
if (minShouldMatch > 1) {
|
if (minShouldMatch > 1) {
|
||||||
return new MinShouldMatchSumScorer(this, optional, minShouldMatch, coords);
|
return new MinShouldMatchSumScorer(this, optional, minShouldMatch, coords);
|
||||||
|
@ -407,13 +425,4 @@ public class BooleanWeight extends Weight {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private float[] coords() {
|
|
||||||
float[] coords = new float[maxCoord+1];
|
|
||||||
coords[0] = 0F;
|
|
||||||
for (int i = 1; i < coords.length; i++) {
|
|
||||||
coords[i] = coord(i, maxCoord);
|
|
||||||
}
|
|
||||||
return coords;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -674,7 +674,7 @@ public class TestBooleanQuery extends LuceneTestCase {
|
||||||
|
|
||||||
final Weight weight = searcher.createNormalizedWeight(q, random().nextBoolean());
|
final Weight weight = searcher.createNormalizedWeight(q, random().nextBoolean());
|
||||||
final Scorer scorer = weight.scorer(reader.leaves().get(0), null);
|
final Scorer scorer = weight.scorer(reader.leaves().get(0), null);
|
||||||
assertTrue(scorer instanceof BoostedScorer);
|
assertTrue(scorer instanceof BoostedScorer || scorer instanceof ExactPhraseScorer);
|
||||||
assertNotNull(scorer.asTwoPhaseIterator());
|
assertNotNull(scorer.asTwoPhaseIterator());
|
||||||
|
|
||||||
reader.close();
|
reader.close();
|
||||||
|
|
Loading…
Reference in New Issue