mirror of https://github.com/apache/lucene.git
LUCENE-7957: ConjunctionScorer.getChildren was failing to return all child scorers
This commit is contained in:
parent
bc95209774
commit
cec5b418ea
|
@ -65,6 +65,9 @@ Bug Fixes
|
||||||
it did not properly break ties on the surface forms when both the weights and
|
it did not properly break ties on the surface forms when both the weights and
|
||||||
the analyzed forms were equal. (Robert Muir)
|
the analyzed forms were equal. (Robert Muir)
|
||||||
|
|
||||||
|
* LUCENE-7957: ConjunctionScorer.getChildren was failing to return all
|
||||||
|
child scorers (Adrien Grand, Mike McCandless)
|
||||||
|
|
||||||
Build
|
Build
|
||||||
|
|
||||||
* SOLR-11181: Switch order of maven artifact publishing procedure: deploy first
|
* SOLR-11181: Switch order of maven artifact publishing procedure: deploy first
|
||||||
|
|
|
@ -26,6 +26,7 @@ class ConjunctionScorer extends Scorer {
|
||||||
|
|
||||||
final DocIdSetIterator disi;
|
final DocIdSetIterator disi;
|
||||||
final Scorer[] scorers;
|
final Scorer[] scorers;
|
||||||
|
final Collection<Scorer> required;
|
||||||
|
|
||||||
/** Create a new {@link ConjunctionScorer}, note that {@code scorers} must be a subset of {@code required}. */
|
/** Create a new {@link ConjunctionScorer}, note that {@code scorers} must be a subset of {@code required}. */
|
||||||
ConjunctionScorer(Weight weight, Collection<Scorer> required, Collection<Scorer> scorers) {
|
ConjunctionScorer(Weight weight, Collection<Scorer> required, Collection<Scorer> scorers) {
|
||||||
|
@ -33,6 +34,7 @@ class ConjunctionScorer extends Scorer {
|
||||||
assert required.containsAll(scorers);
|
assert required.containsAll(scorers);
|
||||||
this.disi = ConjunctionDISI.intersectScorers(required);
|
this.disi = ConjunctionDISI.intersectScorers(required);
|
||||||
this.scorers = scorers.toArray(new Scorer[scorers.size()]);
|
this.scorers = scorers.toArray(new Scorer[scorers.size()]);
|
||||||
|
this.required = required;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -67,7 +69,7 @@ class ConjunctionScorer extends Scorer {
|
||||||
@Override
|
@Override
|
||||||
public Collection<ChildScorer> getChildren() {
|
public Collection<ChildScorer> getChildren() {
|
||||||
ArrayList<ChildScorer> children = new ArrayList<>();
|
ArrayList<ChildScorer> children = new ArrayList<>();
|
||||||
for (Scorer scorer : scorers) {
|
for (Scorer scorer : required) {
|
||||||
children.add(new ChildScorer(scorer, "MUST"));
|
children.add(new ChildScorer(scorer, "MUST"));
|
||||||
}
|
}
|
||||||
return children;
|
return children;
|
||||||
|
|
|
@ -18,22 +18,29 @@ package org.apache.lucene.search;
|
||||||
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import org.apache.lucene.analysis.Analyzer;
|
import org.apache.lucene.analysis.Analyzer;
|
||||||
import org.apache.lucene.analysis.MockAnalyzer;
|
import org.apache.lucene.analysis.MockAnalyzer;
|
||||||
import org.apache.lucene.document.Document;
|
import org.apache.lucene.document.Document;
|
||||||
|
import org.apache.lucene.document.Field.Store;
|
||||||
|
import org.apache.lucene.document.Field;
|
||||||
import org.apache.lucene.document.StringField;
|
import org.apache.lucene.document.StringField;
|
||||||
import org.apache.lucene.document.TextField;
|
import org.apache.lucene.document.TextField;
|
||||||
import org.apache.lucene.document.Field.Store;
|
import org.apache.lucene.index.DirectoryReader;
|
||||||
import org.apache.lucene.index.LeafReaderContext;
|
|
||||||
import org.apache.lucene.index.FieldInvertState;
|
import org.apache.lucene.index.FieldInvertState;
|
||||||
import org.apache.lucene.index.IndexReader;
|
import org.apache.lucene.index.IndexReader;
|
||||||
|
import org.apache.lucene.index.IndexWriter;
|
||||||
import org.apache.lucene.index.IndexWriterConfig;
|
import org.apache.lucene.index.IndexWriterConfig;
|
||||||
|
import org.apache.lucene.index.LeafReaderContext;
|
||||||
import org.apache.lucene.index.RandomIndexWriter;
|
import org.apache.lucene.index.RandomIndexWriter;
|
||||||
import org.apache.lucene.index.Term;
|
import org.apache.lucene.index.Term;
|
||||||
import org.apache.lucene.search.similarities.Similarity;
|
import org.apache.lucene.search.similarities.Similarity;
|
||||||
import org.apache.lucene.store.Directory;
|
import org.apache.lucene.store.Directory;
|
||||||
import org.apache.lucene.util.BytesRef;
|
import org.apache.lucene.util.BytesRef;
|
||||||
|
import org.apache.lucene.util.IOUtils;
|
||||||
import org.apache.lucene.util.LuceneTestCase;
|
import org.apache.lucene.util.LuceneTestCase;
|
||||||
|
|
||||||
public class TestConjunctions extends LuceneTestCase {
|
public class TestConjunctions extends LuceneTestCase {
|
||||||
|
@ -119,4 +126,49 @@ public class TestConjunctions extends LuceneTestCase {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testScorerGetChildren() throws Exception {
|
||||||
|
Directory dir = newDirectory();
|
||||||
|
IndexWriter w = new IndexWriter(dir, newIndexWriterConfig());
|
||||||
|
Document doc = new Document();
|
||||||
|
doc.add(newTextField("field", "a b", Field.Store.NO));
|
||||||
|
w.addDocument(doc);
|
||||||
|
IndexReader r = DirectoryReader.open(w);
|
||||||
|
BooleanQuery.Builder b = new BooleanQuery.Builder();
|
||||||
|
b.add(new TermQuery(new Term("field", "a")), BooleanClause.Occur.MUST);
|
||||||
|
b.add(new TermQuery(new Term("field", "b")), BooleanClause.Occur.FILTER);
|
||||||
|
Query q = b.build();
|
||||||
|
IndexSearcher s = new IndexSearcher(r);
|
||||||
|
final boolean[] setScorerCalled = new boolean[1];
|
||||||
|
s.search(q, new SimpleCollector() {
|
||||||
|
@Override
|
||||||
|
public void setScorer(Scorer s) throws IOException {
|
||||||
|
Collection<Scorer.ChildScorer> childScorers = s.getChildren();
|
||||||
|
setScorerCalled[0] = true;
|
||||||
|
assertEquals(2, childScorers.size());
|
||||||
|
Set<String> terms = new HashSet<>();
|
||||||
|
for (Scorer.ChildScorer childScorer : childScorers) {
|
||||||
|
Query query = childScorer.child.getWeight().getQuery();
|
||||||
|
assertTrue(query instanceof TermQuery);
|
||||||
|
Term term = ((TermQuery) query).getTerm();
|
||||||
|
assertEquals("field", term.field());
|
||||||
|
terms.add(term.text());
|
||||||
|
}
|
||||||
|
assertEquals(2, terms.size());
|
||||||
|
assertTrue(terms.contains("a"));
|
||||||
|
assertTrue(terms.contains("b"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void collect(int doc) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean needsScores() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
assertTrue(setScorerCalled[0]);
|
||||||
|
IOUtils.close(r, w, dir);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue