LUCENE-9976: Fix WANDScorer assertion error (#171)

LUCENE-9976: Fix WANDScorer assertion error as (tailMaxScore >= minCompetitiveScore) && (tailSize < minShouldMatch) are valid now
This commit is contained in:
zacharymorn 2021-06-09 00:11:10 -07:00 committed by GitHub
parent d22af75686
commit 8bcaf87a83
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 54 additions and 1 deletions

View File

@ -352,6 +352,8 @@ Other
* LUCENE-9907: Remove dependency on PackedInts#getReader() from the current codecs and move the * LUCENE-9907: Remove dependency on PackedInts#getReader() from the current codecs and move the
method to backwards codec. (Ignacio Vera) method to backwards codec. (Ignacio Vera)
* LUCENE-9976: Fix WANDScorer assertion error. (Zach Chen, Adrien Grand, Dawid Weiss)
======================= Lucene 8.9.0 ======================= ======================= Lucene 8.9.0 =======================
API Changes API Changes

View File

@ -220,7 +220,9 @@ final class WANDScorer extends Scorer {
} }
assert maxScoreSum == leadMaxScore : maxScoreSum + " " + leadMaxScore; assert maxScoreSum == leadMaxScore : maxScoreSum + " " + leadMaxScore;
assert minCompetitiveScore == 0 || tailMaxScore < minCompetitiveScore; assert minCompetitiveScore == 0
|| tailMaxScore < minCompetitiveScore
|| tailSize < minShouldMatch;
assert doc <= upTo; assert doc <= upTo;
} }

View File

@ -312,6 +312,55 @@ public class TestWANDScorer extends LuceneTestCase {
} }
} }
public void testBasicsWithDisjunctionAndMinShouldMatchAndTailSizeCondition() throws Exception {
try (Directory dir = newDirectory()) {
try (IndexWriter w =
new IndexWriter(dir, newIndexWriterConfig().setMergePolicy(newLogMergePolicy()))) {
for (String[] values :
Arrays.asList(
new String[] {"A", "B"}, // 0
new String[] {"A"}, // 1
new String[] {}, // 2
new String[] {"A", "B", "C"}, // 3
// 2 "B"s here and the non constant score term query below forces the
// tailMaxScore >= minCompetitiveScore && tailSize < minShouldMatch condition
new String[] {"B", "B"}, // 4
new String[] {"B", "C"} // 5
)) {
Document doc = new Document();
for (String value : values) {
doc.add(new StringField("foo", value, Store.NO));
}
w.addDocument(doc);
}
w.forceMerge(1);
}
try (IndexReader reader = DirectoryReader.open(dir)) {
IndexSearcher searcher = newSearcher(reader);
Query query =
new BooleanQuery.Builder()
.add(new TermQuery(new Term("foo", "A")), Occur.SHOULD)
.add(new TermQuery(new Term("foo", "B")), Occur.SHOULD)
.add(new TermQuery(new Term("foo", "C")), Occur.SHOULD)
.setMinimumNumberShouldMatch(2)
.build();
Scorer scorer =
searcher
.createWeight(searcher.rewrite(query), ScoreMode.TOP_SCORES, 1)
.scorer(searcher.getIndexReader().leaves().get(0));
assertEquals(0, scorer.iterator().nextDoc());
scorer.setMinCompetitiveScore(scorer.score());
assertEquals(3, scorer.iterator().nextDoc());
}
}
}
public void testBasicsWithDisjunctionAndMinShouldMatchAndNonScoringMode() throws Exception { public void testBasicsWithDisjunctionAndMinShouldMatchAndNonScoringMode() throws Exception {
try (Directory dir = newDirectory()) { try (Directory dir = newDirectory()) {
try (IndexWriter w = try (IndexWriter w =