diff --git a/server/src/main/java/org/elasticsearch/index/engine/Engine.java b/server/src/main/java/org/elasticsearch/index/engine/Engine.java index 8b0e84105055c..c7b636da2362c 100644 --- a/server/src/main/java/org/elasticsearch/index/engine/Engine.java +++ b/server/src/main/java/org/elasticsearch/index/engine/Engine.java @@ -26,10 +26,14 @@ import org.apache.lucene.index.SegmentReader; import org.apache.lucene.index.Terms; import org.apache.lucene.index.TermsEnum; +import org.apache.lucene.search.Collector; +import org.apache.lucene.search.CollectorManager; import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.Query; import org.apache.lucene.search.QueryCache; import org.apache.lucene.search.QueryCachingPolicy; import org.apache.lucene.search.ReferenceManager; +import org.apache.lucene.search.Weight; import org.apache.lucene.search.similarities.Similarity; import org.apache.lucene.store.AlreadyClosedException; import org.apache.lucene.util.BytesRef; @@ -1553,7 +1557,8 @@ public Searcher( QueryCachingPolicy queryCachingPolicy, Closeable onClose ) { - super(reader); + // pass in an executor so we can shortcut and avoid looping through all segments + super(reader, source.equals(CAN_MATCH_SEARCH_SOURCE) ? Runnable::run : null); setSimilarity(similarity); setQueryCache(queryCache); setQueryCachingPolicy(queryCachingPolicy); @@ -1561,6 +1566,14 @@ public Searcher( this.onClose = onClose; } + private static final LeafSlice[] EMPTY_SLICES = new LeafSlice[0]; + + @Override + protected LeafSlice[] slices(List leaves) { + assert source.equals(CAN_MATCH_SEARCH_SOURCE); + return EMPTY_SLICES; + } + /** * The source that caused this searcher to be acquired. */ @@ -1586,6 +1599,19 @@ public void close() { throw new AssertionError(e); } } + + @Override + protected void searchLeaf(LeafReaderContext ctx, int minDocId, int maxDocId, Weight weight, Collector collector) + throws IOException { + assert source.equals(CAN_MATCH_SEARCH_SOURCE) == false; + super.searchLeaf(ctx, minDocId, maxDocId, weight, collector); + } + + @Override + public T search(Query query, CollectorManager collectorManager) throws IOException { + assert source.equals(CAN_MATCH_SEARCH_SOURCE) == false; + return super.search(query, collectorManager); + } } public abstract static class Operation {