|
29 | 29 | import org.apache.lucene.index.FieldInvertState;
|
30 | 30 | import org.apache.lucene.index.IndexReader;
|
31 | 31 | import org.apache.lucene.index.IndexWriterConfig;
|
| 32 | +import org.apache.lucene.index.LeafReaderContext; |
32 | 33 | import org.apache.lucene.index.MultiReader;
|
33 | 34 | import org.apache.lucene.index.Term;
|
34 | 35 | import org.apache.lucene.search.similarities.BM25Similarity;
|
|
42 | 43 | import org.apache.lucene.tests.index.RandomIndexWriter;
|
43 | 44 | import org.apache.lucene.tests.search.CheckHits;
|
44 | 45 | import org.apache.lucene.tests.util.LuceneTestCase;
|
| 46 | +import org.apache.lucene.tests.util.TestUtil; |
| 47 | +import org.apache.lucene.util.Bits; |
45 | 48 |
|
46 | 49 | public class TestCombinedFieldQuery extends LuceneTestCase {
|
47 | 50 | public void testInvalid() {
|
@@ -560,4 +563,110 @@ public CollectionStatistics collectionStatistics(String field) throws IOExceptio
|
560 | 563 | w.close();
|
561 | 564 | dir.close();
|
562 | 565 | }
|
| 566 | + |
| 567 | + public void testNextDocsAndScores() throws IOException { |
| 568 | + int numMatchDoc = randomIntBetween(100, 500); |
| 569 | + int boost1 = Math.max(1, random().nextInt(5)); |
| 570 | + int boost2 = Math.max(1, random().nextInt(5)); |
| 571 | + |
| 572 | + Directory dir = newDirectory(); |
| 573 | + Similarity similarity = randomCompatibleSimilarity(); |
| 574 | + |
| 575 | + IndexWriterConfig iwc = new IndexWriterConfig(); |
| 576 | + iwc.setSimilarity(similarity); |
| 577 | + RandomIndexWriter w = new RandomIndexWriter(random(), dir, iwc); |
| 578 | + |
| 579 | + // adding potentially matching doc |
| 580 | + for (int i = 0; i < numMatchDoc; i++) { |
| 581 | + Document doc = new Document(); |
| 582 | + |
| 583 | + int freqA = random().nextInt(20) + 1; |
| 584 | + for (int j = 0; j < freqA; j++) { |
| 585 | + doc.add(new TextField("a", "foo", Store.NO)); |
| 586 | + } |
| 587 | + |
| 588 | + freqA = random().nextInt(20) + 1; |
| 589 | + if (randomBoolean()) { |
| 590 | + for (int j = 0; j < freqA; j++) { |
| 591 | + doc.add(new TextField("a", "foo" + j, Store.NO)); |
| 592 | + } |
| 593 | + } |
| 594 | + |
| 595 | + freqA = random().nextInt(20) + 1; |
| 596 | + for (int j = 0; j < freqA; j++) { |
| 597 | + doc.add(new TextField("a", "zoo", Store.NO)); |
| 598 | + } |
| 599 | + |
| 600 | + int freqB = random().nextInt(20) + 1; |
| 601 | + for (int j = 0; j < freqB; j++) { |
| 602 | + doc.add(new TextField("b", "zoo", Store.NO)); |
| 603 | + } |
| 604 | + |
| 605 | + freqB = random().nextInt(20) + 1; |
| 606 | + if (randomBoolean()) { |
| 607 | + for (int j = 0; j < freqB; j++) { |
| 608 | + doc.add(new TextField("b", "zoo" + j, Store.NO)); |
| 609 | + } |
| 610 | + } |
| 611 | + |
| 612 | + int freqC = random().nextInt(20) + 1; |
| 613 | + for (int j = 0; j < freqC; j++) { |
| 614 | + doc.add(new TextField("c", "bla" + j, Store.NO)); |
| 615 | + } |
| 616 | + w.addDocument(doc); |
| 617 | + } |
| 618 | + |
| 619 | + w.forceMerge(1); |
| 620 | + |
| 621 | + IndexReader reader = getOnlyLeafReader(w.getReader()); |
| 622 | + IndexSearcher searcher = newSearcher(reader, false); |
| 623 | + searcher.setSimilarity(similarity); |
| 624 | + |
| 625 | + CombinedFieldQuery query = |
| 626 | + new CombinedFieldQuery.Builder("foo") |
| 627 | + .addField("a", (float) boost1) |
| 628 | + .addField("b", (float) boost2) |
| 629 | + .build(); |
| 630 | + |
| 631 | + Weight weight = searcher.createWeight(query, ScoreMode.TOP_SCORES, 1f); |
| 632 | + LeafReaderContext context = searcher.getIndexReader().leaves().get(0); |
| 633 | + Bits liveDocs = context.reader().getLiveDocs(); |
| 634 | + |
| 635 | + Scorer scorer1 = weight.scorer(context); |
| 636 | + Scorer scorer2 = weight.scorer(context); |
| 637 | + scorer1.iterator().nextDoc(); |
| 638 | + scorer2.iterator().nextDoc(); |
| 639 | + DocAndFloatFeatureBuffer buffer = new DocAndFloatFeatureBuffer(); |
| 640 | + while (true) { |
| 641 | + int curDoc = scorer2.iterator().docID(); |
| 642 | + int upTo = |
| 643 | + TestUtil.nextInt(random(), curDoc, (int) Math.min(Integer.MAX_VALUE, curDoc + 512L)); |
| 644 | + scorer1.nextDocsAndScores(upTo, liveDocs, buffer); |
| 645 | + assertEquals(buffer.size == 0, curDoc >= upTo); |
| 646 | + |
| 647 | + for (int i = 0; i < buffer.size; ++i) { |
| 648 | + while (liveDocs != null && liveDocs.get(scorer2.iterator().docID()) == false) { |
| 649 | + scorer2.iterator().nextDoc(); |
| 650 | + } |
| 651 | + assertEquals(scorer2.iterator().docID(), buffer.docs[i]); |
| 652 | + assertEquals(scorer2.score(), buffer.features[i], 0f); |
| 653 | + scorer2.iterator().nextDoc(); |
| 654 | + } |
| 655 | + |
| 656 | + assertEquals(scorer2.iterator().docID(), scorer1.iterator().docID()); |
| 657 | + if (scorer1.iterator().docID() == DocIdSetIterator.NO_MORE_DOCS) { |
| 658 | + break; |
| 659 | + } |
| 660 | + } |
| 661 | + |
| 662 | + Scorer scorer3 = weight.scorer(context); |
| 663 | + scorer3.iterator().nextDoc(); |
| 664 | + scorer3.nextDocsAndScores( |
| 665 | + DocIdSetIterator.NO_MORE_DOCS, new Bits.MatchNoBits(context.reader().maxDoc()), buffer); |
| 666 | + assertEquals(0, buffer.size); |
| 667 | + |
| 668 | + reader.close(); |
| 669 | + w.close(); |
| 670 | + dir.close(); |
| 671 | + } |
563 | 672 | }
|
0 commit comments