Skip to content

Commit 6130ac2

Browse files
committed
optimize query facet in case the query is a filtered query with match_all query to use just the filter
1 parent ba9a12e commit 6130ac2

File tree

1 file changed

+27
-4
lines changed

1 file changed

+27
-4
lines changed

modules/elasticsearch/src/main/java/org/elasticsearch/search/facet/query/QueryFacetCollector.java

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,10 @@
2020
package org.elasticsearch.search.facet.query;
2121

2222
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.*;
2624
import org.elasticsearch.common.lucene.docset.DocSet;
2725
import org.elasticsearch.common.lucene.docset.DocSets;
26+
import org.elasticsearch.common.lucene.search.MatchAllDocsFilter;
2827
import org.elasticsearch.index.cache.filter.FilterCache;
2928
import org.elasticsearch.search.facet.AbstractFacetCollector;
3029
import org.elasticsearch.search.facet.Facet;
@@ -44,7 +43,12 @@ public class QueryFacetCollector extends AbstractFacetCollector {
4443

4544
public QueryFacetCollector(String facetName, Query query, FilterCache filterCache) {
4645
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+
}
4852
}
4953

5054
@Override protected void doSetNextReader(IndexReader reader, int docBase) throws IOException {
@@ -60,4 +64,23 @@ public QueryFacetCollector(String facetName, Query query, FilterCache filterCach
6064
@Override public Facet facet() {
6165
return new InternalQueryFacet(facetName, count);
6266
}
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+
}
6386
}

0 commit comments

Comments
 (0)