3232import org .elasticsearch .index .mapper .FieldMapper ;
3333import org .elasticsearch .index .mapper .internal .IdFieldMapper ;
3434import org .elasticsearch .index .query .ParsedQuery ;
35+ import org .elasticsearch .index .search .nested .NonNestedDocsFilter ;
3536import org .elasticsearch .search .aggregations .AggregationPhase ;
3637import org .elasticsearch .search .aggregations .Aggregator ;
3738import org .elasticsearch .search .aggregations .bucket .global .GlobalAggregator ;
@@ -55,6 +56,7 @@ abstract class QueryCollector extends Collector {
5556 final IndexSearcher searcher ;
5657 final ConcurrentMap <BytesRef , Query > queries ;
5758 final ESLogger logger ;
59+ boolean isNestedDoc = false ;
5860
5961 final Lucene .ExistsCollector collector = new Lucene .ExistsCollector ();
6062 BytesRef current ;
@@ -63,12 +65,13 @@ abstract class QueryCollector extends Collector {
6365
6466 final List <Collector > facetAndAggregatorCollector ;
6567
66- QueryCollector (ESLogger logger , PercolateContext context ) {
68+ QueryCollector (ESLogger logger , PercolateContext context , boolean isNestedDoc ) {
6769 this .logger = logger ;
6870 this .queries = context .percolateQueries ();
6971 this .searcher = context .docSearcher ();
7072 final FieldMapper <?> idMapper = context .mapperService ().smartNameFieldMapper (IdFieldMapper .NAME );
7173 this .idFieldData = context .fieldData ().getForField (idMapper );
74+ this .isNestedDoc = isNestedDoc ;
7275
7376 ImmutableList .Builder <Collector > facetAggCollectorBuilder = ImmutableList .builder ();
7477 if (context .facets () != null ) {
@@ -139,20 +142,20 @@ public boolean acceptsDocsOutOfOrder() {
139142 }
140143
141144
142- static Match match (ESLogger logger , PercolateContext context , HighlightPhase highlightPhase ) {
143- return new Match (logger , context , highlightPhase );
145+ static Match match (ESLogger logger , PercolateContext context , HighlightPhase highlightPhase , boolean isNestedDoc ) {
146+ return new Match (logger , context , highlightPhase , isNestedDoc );
144147 }
145148
146- static Count count (ESLogger logger , PercolateContext context ) {
147- return new Count (logger , context );
149+ static Count count (ESLogger logger , PercolateContext context , boolean isNestedDoc ) {
150+ return new Count (logger , context , isNestedDoc );
148151 }
149152
150- static MatchAndScore matchAndScore (ESLogger logger , PercolateContext context , HighlightPhase highlightPhase ) {
151- return new MatchAndScore (logger , context , highlightPhase );
153+ static MatchAndScore matchAndScore (ESLogger logger , PercolateContext context , HighlightPhase highlightPhase , boolean isNestedDoc ) {
154+ return new MatchAndScore (logger , context , highlightPhase , isNestedDoc );
152155 }
153156
154- static MatchAndSort matchAndSort (ESLogger logger , PercolateContext context ) {
155- return new MatchAndSort (logger , context );
157+ static MatchAndSort matchAndSort (ESLogger logger , PercolateContext context , boolean isNestedDoc ) {
158+ return new MatchAndSort (logger , context , isNestedDoc );
156159 }
157160
158161
@@ -179,8 +182,8 @@ final static class Match extends QueryCollector {
179182 final int size ;
180183 long counter = 0 ;
181184
182- Match (ESLogger logger , PercolateContext context , HighlightPhase highlightPhase ) {
183- super (logger , context );
185+ Match (ESLogger logger , PercolateContext context , HighlightPhase highlightPhase , boolean isNestedDoc ) {
186+ super (logger , context , isNestedDoc );
184187 this .limit = context .limit ;
185188 this .size = context .size ();
186189 this .context = context ;
@@ -202,7 +205,11 @@ public void collect(int doc) throws IOException {
202205 context .hitContext ().cache ().clear ();
203206 }
204207
205- searcher .search (query , collector );
208+ if (isNestedDoc ) {
209+ searcher .search (query , NonNestedDocsFilter .INSTANCE , collector );
210+ } else {
211+ searcher .search (query , collector );
212+ }
206213 if (collector .exists ()) {
207214 if (!limit || counter < size ) {
208215 matches .add (values .copyShared ());
@@ -236,8 +243,8 @@ final static class MatchAndSort extends QueryCollector {
236243
237244 private final TopScoreDocCollector topDocsCollector ;
238245
239- MatchAndSort (ESLogger logger , PercolateContext context ) {
240- super (logger , context );
246+ MatchAndSort (ESLogger logger , PercolateContext context , boolean isNestedDoc ) {
247+ super (logger , context , isNestedDoc );
241248 // TODO: Use TopFieldCollector.create(...) for ascending and decending scoring?
242249 topDocsCollector = TopScoreDocCollector .create (context .size (), false );
243250 }
@@ -252,7 +259,11 @@ public void collect(int doc) throws IOException {
252259 // run the query
253260 try {
254261 collector .reset ();
255- searcher .search (query , collector );
262+ if (isNestedDoc ) {
263+ searcher .search (query , NonNestedDocsFilter .INSTANCE , collector );
264+ } else {
265+ searcher .search (query , collector );
266+ }
256267 if (collector .exists ()) {
257268 topDocsCollector .collect (doc );
258269 postMatch (doc );
@@ -294,8 +305,8 @@ final static class MatchAndScore extends QueryCollector {
294305
295306 private Scorer scorer ;
296307
297- MatchAndScore (ESLogger logger , PercolateContext context , HighlightPhase highlightPhase ) {
298- super (logger , context );
308+ MatchAndScore (ESLogger logger , PercolateContext context , HighlightPhase highlightPhase , boolean isNestedDoc ) {
309+ super (logger , context , isNestedDoc );
299310 this .limit = context .limit ;
300311 this .size = context .size ();
301312 this .context = context ;
@@ -316,7 +327,11 @@ public void collect(int doc) throws IOException {
316327 context .parsedQuery (new ParsedQuery (query , ImmutableMap .<String , Filter >of ()));
317328 context .hitContext ().cache ().clear ();
318329 }
319- searcher .search (query , collector );
330+ if (isNestedDoc ) {
331+ searcher .search (query , NonNestedDocsFilter .INSTANCE , collector );
332+ } else {
333+ searcher .search (query , collector );
334+ }
320335 if (collector .exists ()) {
321336 if (!limit || counter < size ) {
322337 matches .add (values .copyShared ());
@@ -360,8 +375,8 @@ final static class Count extends QueryCollector {
360375
361376 private long counter = 0 ;
362377
363- Count (ESLogger logger , PercolateContext context ) {
364- super (logger , context );
378+ Count (ESLogger logger , PercolateContext context , boolean isNestedDoc ) {
379+ super (logger , context , isNestedDoc );
365380 }
366381
367382 @ Override
@@ -374,7 +389,11 @@ public void collect(int doc) throws IOException {
374389 // run the query
375390 try {
376391 collector .reset ();
377- searcher .search (query , collector );
392+ if (isNestedDoc ) {
393+ searcher .search (query , NonNestedDocsFilter .INSTANCE , collector );
394+ } else {
395+ searcher .search (query , collector );
396+ }
378397 if (collector .exists ()) {
379398 counter ++;
380399 postMatch (doc );
0 commit comments