Skip to content

Commit 93dec72

Browse files
committed
optimize a filtered query with match_all query into a constant score that just wraps the filter
1 parent 6130ac2 commit 93dec72

File tree

4 files changed

+107
-87
lines changed

4 files changed

+107
-87
lines changed

modules/elasticsearch/src/main/java/org/elasticsearch/common/lucene/search/Queries.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,17 @@ public static Query fixNegativeQueryIfNeeded(Query q) {
8787
}
8888
return q;
8989
}
90+
91+
public static boolean isMatchAllQuery(Query query) {
92+
if (query instanceof MatchAllDocsQuery) {
93+
return true;
94+
}
95+
if (query instanceof DeletionAwareConstantScoreQuery) {
96+
DeletionAwareConstantScoreQuery scoreQuery = (DeletionAwareConstantScoreQuery) query;
97+
if (scoreQuery.getFilter() instanceof MatchAllDocsFilter) {
98+
return true;
99+
}
100+
}
101+
return false;
102+
}
90103
}

modules/elasticsearch/src/main/java/org/elasticsearch/index/query/xcontent/FilteredQueryParser.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,12 @@
1919

2020
package org.elasticsearch.index.query.xcontent;
2121

22+
import org.apache.lucene.search.DeletionAwareConstantScoreQuery;
2223
import org.apache.lucene.search.Filter;
2324
import org.apache.lucene.search.FilteredQuery;
2425
import org.apache.lucene.search.Query;
2526
import org.elasticsearch.common.inject.Inject;
27+
import org.elasticsearch.common.lucene.search.Queries;
2628
import org.elasticsearch.common.settings.Settings;
2729
import org.elasticsearch.common.xcontent.XContentParser;
2830
import org.elasticsearch.index.AbstractIndexComponent;
@@ -86,6 +88,13 @@ public class FilteredQueryParser extends AbstractIndexComponent implements XCont
8688
filter = parseContext.cacheFilter(filter);
8789
}
8890

91+
// if its a match_all query, use constant_score
92+
if (Queries.isMatchAllQuery(query)) {
93+
Query q = new DeletionAwareConstantScoreQuery(filter);
94+
q.setBoost(boost);
95+
return q;
96+
}
97+
8998
// TODO
9099
// With the way filtered queries work today, both query and filter advance (one at a time)
91100
// to get hits. Since all filters support random access, it might make sense to use that.
@@ -96,6 +105,7 @@ public class FilteredQueryParser extends AbstractIndexComponent implements XCont
96105
// - https://issues.apache.org/jira/browse/LUCENE-1536
97106
// - http://chbits.blogspot.com/2010/09/fast-search-filters-using-flex.html
98107

108+
99109
FilteredQuery filteredQuery = new FilteredQuery(query, filter);
100110
filteredQuery.setBoost(boost);
101111
return filteredQuery;

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

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

2222
import org.apache.lucene.index.IndexReader;
23-
import org.apache.lucene.search.*;
23+
import org.apache.lucene.search.Filter;
24+
import org.apache.lucene.search.FilteredQuery;
25+
import org.apache.lucene.search.Query;
26+
import org.apache.lucene.search.QueryWrapperFilter;
2427
import org.elasticsearch.common.lucene.docset.DocSet;
2528
import org.elasticsearch.common.lucene.docset.DocSets;
26-
import org.elasticsearch.common.lucene.search.MatchAllDocsFilter;
29+
import org.elasticsearch.common.lucene.search.Queries;
2730
import org.elasticsearch.index.cache.filter.FilterCache;
2831
import org.elasticsearch.search.facet.AbstractFacetCollector;
2932
import org.elasticsearch.search.facet.Facet;
@@ -71,15 +74,9 @@ public QueryFacetCollector(String facetName, Query query, FilterCache filterCach
7174
private Filter extractFilterIfApplicable(Query query) {
7275
if (query instanceof FilteredQuery) {
7376
FilteredQuery fQuery = (FilteredQuery) query;
74-
if (fQuery.getQuery() instanceof MatchAllDocsQuery) {
77+
if (Queries.isMatchAllQuery(fQuery.getQuery())) {
7578
return fQuery.getFilter();
7679
}
77-
if (fQuery.getQuery() instanceof DeletionAwareConstantScoreQuery) {
78-
DeletionAwareConstantScoreQuery scoreQuery = (DeletionAwareConstantScoreQuery) fQuery.getQuery();
79-
if (scoreQuery.getFilter() instanceof MatchAllDocsFilter) {
80-
return fQuery.getFilter();
81-
}
82-
}
8380
}
8481
return null;
8582
}

0 commit comments

Comments
 (0)