AllTermQuery's scorer should skip segments that never saw the requested term
This commit is contained in:
parent
6ccc759691
commit
c1d8d3b28b
|
@ -149,6 +149,10 @@ public final class AllTermQuery extends Query {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
final TermState state = termStates.get(context.ord);
|
final TermState state = termStates.get(context.ord);
|
||||||
|
if (state == null) {
|
||||||
|
// Term does not exist in this segment
|
||||||
|
return null;
|
||||||
|
}
|
||||||
termsEnum.seekExact(term.bytes(), state);
|
termsEnum.seekExact(term.bytes(), state);
|
||||||
PostingsEnum docs = termsEnum.postings(null, PostingsEnum.PAYLOADS);
|
PostingsEnum docs = termsEnum.postings(null, PostingsEnum.PAYLOADS);
|
||||||
assert docs != null;
|
assert docs != null;
|
||||||
|
|
|
@ -220,6 +220,41 @@ public class SimpleAllTests extends ESTestCase {
|
||||||
indexWriter.close();
|
indexWriter.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testTermMissingFromOneSegment() throws Exception {
|
||||||
|
Directory dir = new RAMDirectory();
|
||||||
|
IndexWriter indexWriter = new IndexWriter(dir, new IndexWriterConfig(Lucene.STANDARD_ANALYZER));
|
||||||
|
|
||||||
|
Document doc = new Document();
|
||||||
|
doc.add(new Field("_id", "1", StoredField.TYPE));
|
||||||
|
AllEntries allEntries = new AllEntries();
|
||||||
|
allEntries.addText("field", "something", 2.0f);
|
||||||
|
allEntries.reset();
|
||||||
|
doc.add(new TextField("_all", AllTokenStream.allTokenStream("_all", allEntries, Lucene.STANDARD_ANALYZER)));
|
||||||
|
|
||||||
|
indexWriter.addDocument(doc);
|
||||||
|
indexWriter.commit();
|
||||||
|
|
||||||
|
doc = new Document();
|
||||||
|
doc.add(new Field("_id", "2", StoredField.TYPE));
|
||||||
|
allEntries = new AllEntries();
|
||||||
|
allEntries.addText("field", "else", 1.0f);
|
||||||
|
allEntries.reset();
|
||||||
|
doc.add(new TextField("_all", AllTokenStream.allTokenStream("_all", allEntries, Lucene.STANDARD_ANALYZER)));
|
||||||
|
|
||||||
|
indexWriter.addDocument(doc);
|
||||||
|
|
||||||
|
IndexReader reader = DirectoryReader.open(indexWriter, true);
|
||||||
|
assertEquals(2, reader.leaves().size());
|
||||||
|
IndexSearcher searcher = new IndexSearcher(reader);
|
||||||
|
|
||||||
|
// "something" only appears in the first segment:
|
||||||
|
Query query = new AllTermQuery(new Term("_all", "something"));
|
||||||
|
TopDocs docs = searcher.search(query, 10);
|
||||||
|
assertEquals(1, docs.totalHits);
|
||||||
|
|
||||||
|
indexWriter.close();
|
||||||
|
}
|
||||||
|
|
||||||
public void testMultipleTokensAllNoBoost() throws Exception {
|
public void testMultipleTokensAllNoBoost() throws Exception {
|
||||||
Directory dir = new RAMDirectory();
|
Directory dir = new RAMDirectory();
|
||||||
IndexWriter indexWriter = new IndexWriter(dir, new IndexWriterConfig(Lucene.STANDARD_ANALYZER));
|
IndexWriter indexWriter = new IndexWriter(dir, new IndexWriterConfig(Lucene.STANDARD_ANALYZER));
|
||||||
|
|
Loading…
Reference in New Issue