20
20
package org .elasticsearch .search .facet .query ;
21
21
22
22
import org .apache .lucene .index .IndexReader ;
23
- import org .apache .lucene .search .Filter ;
24
- import org .apache .lucene .search .Query ;
25
- import org .apache .lucene .search .QueryWrapperFilter ;
23
+ import org .apache .lucene .search .*;
26
24
import org .elasticsearch .common .lucene .docset .DocSet ;
27
25
import org .elasticsearch .common .lucene .docset .DocSets ;
26
+ import org .elasticsearch .common .lucene .search .MatchAllDocsFilter ;
28
27
import org .elasticsearch .index .cache .filter .FilterCache ;
29
28
import org .elasticsearch .search .facet .AbstractFacetCollector ;
30
29
import org .elasticsearch .search .facet .Facet ;
@@ -44,7 +43,12 @@ public class QueryFacetCollector extends AbstractFacetCollector {
44
43
45
44
public QueryFacetCollector (String facetName , Query query , FilterCache filterCache ) {
46
45
super (facetName );
47
- this .filter = filterCache .cache (new QueryWrapperFilter (query ));
46
+ Filter possibleFilter = extractFilterIfApplicable (query );
47
+ if (possibleFilter != null ) {
48
+ this .filter = filterCache .cache (possibleFilter );
49
+ } else {
50
+ this .filter = filterCache .cache (new QueryWrapperFilter (query ));
51
+ }
48
52
}
49
53
50
54
@ Override protected void doSetNextReader (IndexReader reader , int docBase ) throws IOException {
@@ -60,4 +64,23 @@ public QueryFacetCollector(String facetName, Query query, FilterCache filterCach
60
64
@ Override public Facet facet () {
61
65
return new InternalQueryFacet (facetName , count );
62
66
}
67
+
68
+ /**
69
+ * If its a filtered query with a match all, then we just need the inner filter.
70
+ */
71
+ private Filter extractFilterIfApplicable (Query query ) {
72
+ if (query instanceof FilteredQuery ) {
73
+ FilteredQuery fQuery = (FilteredQuery ) query ;
74
+ if (fQuery .getQuery () instanceof MatchAllDocsQuery ) {
75
+ return fQuery .getFilter ();
76
+ }
77
+ if (fQuery .getQuery () instanceof DeletionAwareConstantScoreQuery ) {
78
+ DeletionAwareConstantScoreQuery scoreQuery = (DeletionAwareConstantScoreQuery ) fQuery .getQuery ();
79
+ if (scoreQuery .getFilter () instanceof MatchAllDocsFilter ) {
80
+ return fQuery .getFilter ();
81
+ }
82
+ }
83
+ }
84
+ return null ;
85
+ }
63
86
}
0 commit comments