From ca7fa4f9ec717a7925112c61c6cd872ec6c93e39 Mon Sep 17 00:00:00 2001 From: Martijn van Groningen Date: Wed, 16 Jul 2014 23:55:39 +0200 Subject: [PATCH] Query: When parent doc is found stop iterating over segments and continue with the next top matching child doc. The parent doc has been found and there is no need to check subsequent segments. Closes #6895 Closes #1843 --- .../elasticsearch/index/search/child/TopChildrenQuery.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/elasticsearch/index/search/child/TopChildrenQuery.java b/src/main/java/org/elasticsearch/index/search/child/TopChildrenQuery.java index b40868b5374..e14d1e8247c 100644 --- a/src/main/java/org/elasticsearch/index/search/child/TopChildrenQuery.java +++ b/src/main/java/org/elasticsearch/index/search/child/TopChildrenQuery.java @@ -176,7 +176,7 @@ public class TopChildrenQuery extends Query { int resolveParentDocuments(TopDocs topDocs, SearchContext context, Recycler.V> parentDocs) throws Exception { int parentHitsResolved = 0; Recycler.V>>> parentDocsPerReader = cacheRecycler.hashMap(context.searcher().getIndexReader().leaves().size()); - for (ScoreDoc scoreDoc : topDocs.scoreDocs) { + child_hits: for (ScoreDoc scoreDoc : topDocs.scoreDocs) { int readerIndex = ReaderUtil.subIndex(scoreDoc.doc, context.searcher().getIndexReader().leaves()); AtomicReaderContext subContext = context.searcher().getIndexReader().leaves().get(readerIndex); BytesValues.WithOrdinals parentValues = parentChildIndexFieldData.load(subContext).getBytesValues(parentType); @@ -212,13 +212,11 @@ public class TopChildrenQuery extends Query { } if (parentDocId != DocsEnum.NO_MORE_DOCS) { // we found a match, add it and break - Recycler.V> readerParentDocs = parentDocsPerReader.v().get(indexReader.getCoreCacheKey()); if (readerParentDocs == null) { readerParentDocs = cacheRecycler.intObjectMap(indexReader.maxDoc()); parentDocsPerReader.v().put(indexReader.getCoreCacheKey(), readerParentDocs); } - ParentDoc parentDoc = readerParentDocs.v().get(parentDocId); if (parentDoc == null) { parentHitsResolved++; // we have a hit on a parent @@ -235,6 +233,7 @@ public class TopChildrenQuery extends Query { parentDoc.maxScore = scoreDoc.score; } } + continue child_hits; } } }