From 481c66f1687bc7bfefb632a72dd8247fb8d9e50d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20Laleve=CC=81e?= Date: Wed, 4 Apr 2012 16:14:22 +0200 Subject: [PATCH] Stop iterating on sub readers if the parent is found in TopChildrenQuery --- .../index/search/child/TopChildrenQuery.java | 63 +++++++++++-------- 1 file changed, 36 insertions(+), 27 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 47a10f42d3e7e..c96789f28e6dc 100644 --- a/src/main/java/org/elasticsearch/index/search/child/TopChildrenQuery.java +++ b/src/main/java/org/elasticsearch/index/search/child/TopChildrenQuery.java @@ -134,34 +134,43 @@ public void processResults(TopDocs topDocs, SearchContext context) { // no parent found continue; } + // now go over and find the parent doc Id and reader tuple - for (IndexReader indexReader : context.searcher().subReaders()) { - int parentDocId = context.idCache().reader(indexReader).docById(parentType, parentId); - if (parentDocId != -1 && !indexReader.isDeleted(parentDocId)) { - // we found a match, add it and break - - TIntObjectHashMap readerParentDocs = parentDocsPerReader.get(indexReader.getCoreCacheKey()); - if (readerParentDocs == null) { - readerParentDocs = new TIntObjectHashMap(); - parentDocsPerReader.put(indexReader.getCoreCacheKey(), readerParentDocs); - } - - ParentDoc parentDoc = readerParentDocs.get(parentDocId); - if (parentDoc == null) { - numHits++; // we have a hit on a parent - parentDoc = new ParentDoc(); - parentDoc.docId = parentDocId; - parentDoc.count = 1; - parentDoc.maxScore = scoreDoc.score; - parentDoc.sumScores = scoreDoc.score; - readerParentDocs.put(parentDocId, parentDoc); - } else { - parentDoc.count++; - parentDoc.sumScores += scoreDoc.score; - if (scoreDoc.score > parentDoc.maxScore) { - parentDoc.maxScore = scoreDoc.score; - } - } + int parentReaderIndex = 0; + int parentDocId = -1; + IndexReader parentIndexReader = null; + while (parentDocId == -1 && parentReaderIndex < context.searcher().subReaders().length) { + parentIndexReader = context.searcher().subReaders()[parentReaderIndex++]; + parentDocId = context.idCache().reader(parentIndexReader).docById(parentType, parentId); + if (parentDocId != -1 && parentIndexReader.isDeleted(parentDocId)) { + parentDocId = -1; + } + } + + if (parentDocId == -1) { + continue; + } + + TIntObjectHashMap readerParentDocs = parentDocsPerReader.get(parentIndexReader.getCoreCacheKey()); + if (readerParentDocs == null) { + readerParentDocs = new TIntObjectHashMap(); + parentDocsPerReader.put(parentIndexReader.getCoreCacheKey(), readerParentDocs); + } + + ParentDoc parentDoc = readerParentDocs.get(parentDocId); + if (parentDoc == null) { + numHits++; // we have a hit on a parent + parentDoc = new ParentDoc(); + parentDoc.docId = parentDocId; + parentDoc.count = 1; + parentDoc.maxScore = scoreDoc.score; + parentDoc.sumScores = scoreDoc.score; + readerParentDocs.put(parentDocId, parentDoc); + } else { + parentDoc.count++; + parentDoc.sumScores += scoreDoc.score; + if (scoreDoc.score > parentDoc.maxScore) { + parentDoc.maxScore = scoreDoc.score; } } }