mirror of https://github.com/apache/lucene.git
Add getMatchingChildren() method to Scorer
This commit is contained in:
parent
8fa0a8dd1e
commit
9403372fbc
|
@ -130,6 +130,10 @@ New features
|
|||
SortedSetDocValues to allow filtering their TermsEnums with a
|
||||
CompiledAutomaton (Alan Woodward, Mike McCandless)
|
||||
|
||||
* LUCENE-7628: Scorer now has a getMatchingChildren() method that will
|
||||
return all child scorers positioned on the current document. (Alan
|
||||
Woodward)
|
||||
|
||||
Bug Fixes
|
||||
|
||||
* LUCENE-7547: JapaneseTokenizerFactory was failing to close the
|
||||
|
|
|
@ -202,4 +202,12 @@ abstract class DisjunctionScorer extends Scorer {
|
|||
return children;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<ChildScorer> getMatchingChildren() throws IOException {
|
||||
List<ChildScorer> children = new ArrayList<>();
|
||||
for (DisiWrapper w = getSubMatches(); w != null; w = w.next) {
|
||||
children.add(new ChildScorer(w.scorer, "SHOULD"));
|
||||
}
|
||||
return children;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -132,6 +132,15 @@ final class MinShouldMatchSumScorer extends Scorer {
|
|||
return childScorers;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Collection<ChildScorer> getMatchingChildren() throws IOException {
|
||||
List<ChildScorer> children = new ArrayList<>();
|
||||
for (DisiWrapper s = lead; s != null; s = s.next) {
|
||||
children.add(new ChildScorer(s.scorer, "SHOULD"));
|
||||
}
|
||||
return children;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DocIdSetIterator iterator() {
|
||||
return new DocIdSetIterator() {
|
||||
|
|
|
@ -82,6 +82,14 @@ public abstract class Scorer {
|
|||
public Collection<ChildScorer> getChildren() {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns child sub-scorers that match the current document
|
||||
* @lucene.experimental
|
||||
*/
|
||||
public Collection<ChildScorer> getMatchingChildren() throws IOException {
|
||||
return getChildren();
|
||||
}
|
||||
|
||||
/** A child Scorer and its relationship to its parent.
|
||||
* the meaning of the relationship depends upon the parent query.
|
||||
|
|
|
@ -108,6 +108,39 @@ public class TestBooleanQueryVisitSubscorers extends LuceneTestCase {
|
|||
assertEquals(2, tfs.get(1).intValue()); // f2:search + f2:lucene
|
||||
assertEquals(2, tfs.get(2).intValue()); // f2:search + f2:lucene
|
||||
}
|
||||
|
||||
public void testDisjunctionMatches() throws IOException {
|
||||
BooleanQuery.Builder bq1 = new BooleanQuery.Builder();
|
||||
bq1.add(new TermQuery(new Term(F1, "lucene")), Occur.SHOULD);
|
||||
bq1.add(new PhraseQuery(F2, "search", "engine"), Occur.SHOULD);
|
||||
|
||||
Weight w1 = scorerSearcher.createNormalizedWeight(bq1.build(), true);
|
||||
Scorer s1 = w1.scorer(reader.leaves().get(0));
|
||||
assertEquals(0, s1.iterator().nextDoc());
|
||||
assertEquals(2, s1.getMatchingChildren().size());
|
||||
|
||||
BooleanQuery.Builder bq2 = new BooleanQuery.Builder();
|
||||
bq2.add(new TermQuery(new Term(F1, "lucene")), Occur.SHOULD);
|
||||
bq2.add(new PhraseQuery(F2, "search", "library"), Occur.SHOULD);
|
||||
|
||||
Weight w2 = scorerSearcher.createNormalizedWeight(bq2.build(), true);
|
||||
Scorer s2 = w2.scorer(reader.leaves().get(0));
|
||||
assertEquals(0, s2.iterator().nextDoc());
|
||||
assertEquals(1, s2.getMatchingChildren().size());
|
||||
}
|
||||
|
||||
public void testMinShouldMatchMatches() throws IOException {
|
||||
BooleanQuery.Builder bq = new BooleanQuery.Builder();
|
||||
bq.add(new TermQuery(new Term(F1, "lucene")), Occur.SHOULD);
|
||||
bq.add(new TermQuery(new Term(F2, "lucene")), Occur.SHOULD);
|
||||
bq.add(new PhraseQuery(F2, "search", "library"), Occur.SHOULD);
|
||||
bq.setMinimumNumberShouldMatch(2);
|
||||
|
||||
Weight w = scorerSearcher.createNormalizedWeight(bq.build(), true);
|
||||
Scorer s = w.scorer(reader.leaves().get(0));
|
||||
assertEquals(0, s.iterator().nextDoc());
|
||||
assertEquals(2, s.getMatchingChildren().size());
|
||||
}
|
||||
|
||||
public void testConjunctions() throws IOException {
|
||||
BooleanQuery.Builder bq = new BooleanQuery.Builder();
|
||||
|
|
Loading…
Reference in New Issue