Index: lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java =================================================================== --- lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java (revision 1505274) +++ lucene/core/src/java/org/apache/lucene/search/IndexSearcher.java (working copy) @@ -430,6 +430,10 @@ if (limit == 0) { limit = 1; } + if (after != null && after.doc >= limit) { + throw new IllegalArgumentException("after.doc exceeds the number of documents in that reader: after.doc=" + + after.doc + " limit=" + limit); + } nDocs = Math.min(nDocs, limit); if (executor == null) { @@ -440,8 +444,7 @@ final ExecutionHelper runner = new ExecutionHelper(executor); for (int i = 0; i < leafSlices.length; i++) { // search each sub - runner.submit( - new SearcherCallableNoSort(lock, this, leafSlices[i], weight, after, nDocs, hq)); + runner.submit(new SearcherCallableNoSort(lock, this, leafSlices[i], weight, after, nDocs, hq)); } int totalHits = 0; Index: lucene/core/src/test/org/apache/lucene/search/TestIndexSearcher.java =================================================================== --- lucene/core/src/test/org/apache/lucene/search/TestIndexSearcher.java (revision 1505274) +++ lucene/core/src/test/org/apache/lucene/search/TestIndexSearcher.java (working copy) @@ -29,9 +29,11 @@ import org.apache.lucene.index.Term; import org.apache.lucene.store.Directory; import org.apache.lucene.util.BytesRef; +import org.apache.lucene.util.IOUtils; import org.apache.lucene.util.LuceneTestCase; import org.apache.lucene.util.NamedThreadFactory; import org.apache.lucene.util._TestUtil; +import org.junit.Test; public class TestIndexSearcher extends LuceneTestCase { Directory dir; @@ -116,4 +118,25 @@ _TestUtil.shutdownExecutorService(service); } + + @Test + public void testSearchAfterPassedMaxDoc() throws Exception { + // LUCENE-5128: ensure we get a meaningful message if searchAfter exceeds maxDoc + Directory dir = newDirectory(); + RandomIndexWriter w = new RandomIndexWriter(random(), dir); + w.addDocument(new Document()); + IndexReader r = w.getReader(); + w.close(); + + IndexSearcher s = new IndexSearcher(r); + try { + s.searchAfter(new ScoreDoc(r.maxDoc(), 0.54f), new MatchAllDocsQuery(), 10); + fail("should have hit IllegalArgumentException when searchAfter exceeds maxDoc"); + } catch (IllegalArgumentException e) { + // ok + } finally { + IOUtils.close(r, dir); + } + } + }