diff --git a/solr/contrib/analytics/src/java/org/apache/solr/analytics/facet/QueryFacet.java b/solr/contrib/analytics/src/java/org/apache/solr/analytics/facet/QueryFacet.java index f344d8b2210..2e82f625fee 100644 --- a/solr/contrib/analytics/src/java/org/apache/solr/analytics/facet/QueryFacet.java +++ b/solr/contrib/analytics/src/java/org/apache/solr/analytics/facet/QueryFacet.java @@ -19,15 +19,14 @@ package org.apache.solr.analytics.facet; import java.util.Map; import java.util.function.Consumer; -import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.Query; -import org.apache.lucene.search.BooleanClause.Occur; import org.apache.solr.analytics.function.ReductionCollectionManager.ReductionDataCollection; import org.apache.solr.common.SolrException; import org.apache.solr.common.SolrException.ErrorCode; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.search.Filter; import org.apache.solr.search.QParser; +import org.apache.solr.search.QueryUtils; /** * A facet that breaks down the data by additional Solr Queries. @@ -51,10 +50,7 @@ public class QueryFacet extends AbstractSolrQueryFacet { } // The searcher sends docIds to the QueryFacetAccumulator which forwards // them to collectQuery() in this class for collection. - Query queryQuery = new BooleanQuery.Builder() - .add(q, Occur.MUST) - .add(filter, Occur.FILTER) - .build(); + Query queryQuery = QueryUtils.combineQueryAndFilter(q, filter); ReductionDataCollection dataCol = collectionManager.newDataCollection(); reductionData.put(queryName, dataCol); diff --git a/solr/contrib/analytics/src/java/org/apache/solr/analytics/facet/RangeFacet.java b/solr/contrib/analytics/src/java/org/apache/solr/analytics/facet/RangeFacet.java index defc9d908b3..ac9bf16799b 100644 --- a/solr/contrib/analytics/src/java/org/apache/solr/analytics/facet/RangeFacet.java +++ b/solr/contrib/analytics/src/java/org/apache/solr/analytics/facet/RangeFacet.java @@ -20,9 +20,7 @@ import java.util.EnumSet; import java.util.List; import java.util.function.Consumer; -import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.Query; -import org.apache.lucene.search.BooleanClause.Occur; import org.apache.solr.analytics.function.ReductionCollectionManager.ReductionDataCollection; import org.apache.solr.analytics.util.FacetRangeGenerator; import org.apache.solr.analytics.util.FacetRangeGenerator.FacetRange; @@ -31,6 +29,7 @@ import org.apache.solr.common.params.FacetParams.FacetRangeOther; import org.apache.solr.request.SolrQueryRequest; import org.apache.solr.schema.SchemaField; import org.apache.solr.search.Filter; +import org.apache.solr.search.QueryUtils; /** * A facet that groups data by a discrete set of ranges. @@ -66,10 +65,7 @@ public class RangeFacet extends AbstractSolrQueryFacet { Query q = sf.getType().getRangeQuery(null, sf, range.lower, range.upper, range.includeLower,range.includeUpper); // The searcher sends docIds to the RangeFacetAccumulator which forwards // them to collectRange() in this class for collection. - Query rangeQuery = new BooleanQuery.Builder() - .add(q, Occur.MUST) - .add(filter, Occur.FILTER) - .build(); + Query rangeQuery = QueryUtils.combineQueryAndFilter(q, filter); ReductionDataCollection dataCol = collectionManager.newDataCollection(); reductionData.put(range.toString(), dataCol); diff --git a/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java b/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java index b15206ab3a0..5e7e5ea521a 100644 --- a/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java +++ b/solr/core/src/java/org/apache/solr/handler/component/ExpandComponent.java @@ -176,7 +176,7 @@ public class ExpandComponent extends SearchComponent implements PluginInfoInitia sort = SortSpecParsing.parseSortSpec(sortParam, rb.req).getSort(); } - Query query; + final Query query; List newFilters = new ArrayList<>(); try { if (qs == null) { @@ -415,8 +415,7 @@ public class ExpandComponent extends SearchComponent implements PluginInfoInitia collector = groupExpandCollector; } - query = QueryUtils.combineQueryAndFilter(query, pfilter.filter); - searcher.search(query, collector); + searcher.search(QueryUtils.combineQueryAndFilter(query, pfilter.filter), collector); ReturnFields returnFields = rb.rsp.getReturnFields(); LongObjectMap groups = ((GroupCollector) groupExpandCollector).getGroups(); diff --git a/solr/core/src/java/org/apache/solr/request/SimpleFacets.java b/solr/core/src/java/org/apache/solr/request/SimpleFacets.java index aab768406bb..9b79d0f7484 100644 --- a/solr/core/src/java/org/apache/solr/request/SimpleFacets.java +++ b/solr/core/src/java/org/apache/solr/request/SimpleFacets.java @@ -47,8 +47,6 @@ import org.apache.lucene.index.MultiTerms; import org.apache.lucene.index.PostingsEnum; import org.apache.lucene.index.Terms; import org.apache.lucene.index.TermsEnum; -import org.apache.lucene.search.BooleanClause.Occur; -import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.Collector; import org.apache.lucene.search.DocIdSetIterator; import org.apache.lucene.search.FilterCollector; @@ -82,11 +80,11 @@ import org.apache.solr.schema.SchemaField; import org.apache.solr.schema.TrieField; import org.apache.solr.search.BitDocSet; import org.apache.solr.search.DocSet; -import org.apache.solr.search.Filter; import org.apache.solr.search.Grouping; import org.apache.solr.search.Insanity; import org.apache.solr.search.QParser; import org.apache.solr.search.QueryParsing; +import org.apache.solr.search.QueryUtils; import org.apache.solr.search.SolrIndexSearcher; import org.apache.solr.search.SyntaxError; import org.apache.solr.search.facet.FacetDebugInfo; @@ -336,12 +334,7 @@ public class SimpleFacets { } AllGroupsCollector collector = new AllGroupsCollector<>(new TermGroupSelector(groupField)); - Filter mainQueryFilter = docSet.getTopFilter(); // This returns a filter that only matches documents matching with q param and fq params - Query filteredFacetQuery = new BooleanQuery.Builder() - .add(facetQuery, Occur.MUST) - .add(mainQueryFilter, Occur.FILTER) - .build(); - searcher.search(filteredFacetQuery, collector); + searcher.search(QueryUtils.combineQueryAndFilter(facetQuery, docSet.getTopFilter()), collector); return collector.getGroupCount(); } diff --git a/solr/core/src/java/org/apache/solr/search/DocSetUtil.java b/solr/core/src/java/org/apache/solr/search/DocSetUtil.java index 7be21775027..3feac405e1c 100644 --- a/solr/core/src/java/org/apache/solr/search/DocSetUtil.java +++ b/solr/core/src/java/org/apache/solr/search/DocSetUtil.java @@ -28,8 +28,6 @@ import org.apache.lucene.index.PostingsEnum; import org.apache.lucene.index.Term; import org.apache.lucene.index.Terms; import org.apache.lucene.index.TermsEnum; -import org.apache.lucene.search.BooleanClause; -import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.Collector; import org.apache.lucene.search.DocIdSetIterator; import org.apache.lucene.search.LeafCollector; @@ -120,11 +118,7 @@ public class DocSetUtil { public static DocSet createDocSet(SolrIndexSearcher searcher, Query query, DocSet filter) throws IOException { if (filter != null) { - Filter luceneFilter = filter.getTopFilter(); - query = new BooleanQuery.Builder() - .add(query, BooleanClause.Occur.MUST) - .add(luceneFilter, BooleanClause.Occur.FILTER) - .build(); + query = QueryUtils.combineQueryAndFilter(query, filter.getTopFilter()); } if (query instanceof TermQuery) { diff --git a/solr/core/src/java/org/apache/solr/search/Grouping.java b/solr/core/src/java/org/apache/solr/search/Grouping.java index 55e511c63a7..aad76237218 100644 --- a/solr/core/src/java/org/apache/solr/search/Grouping.java +++ b/solr/core/src/java/org/apache/solr/search/Grouping.java @@ -438,8 +438,7 @@ public class Grouping { collector = timeLimitingCollector; } try { - Query q = QueryUtils.combineQueryAndFilter(query, luceneFilter); - searcher.search(q, collector); + searcher.search(QueryUtils.combineQueryAndFilter(query, luceneFilter), collector); } catch (TimeLimitingCollector.TimeExceededException | ExitableDirectoryReader.ExitingReaderException x) { log.warn( "Query: " + query + "; " + x.getMessage() ); qr.setPartialResults(true); diff --git a/solr/core/src/java/org/apache/solr/search/QueryUtils.java b/solr/core/src/java/org/apache/solr/search/QueryUtils.java index 5302a7d500c..b911083b373 100644 --- a/solr/core/src/java/org/apache/solr/search/QueryUtils.java +++ b/solr/core/src/java/org/apache/solr/search/QueryUtils.java @@ -151,14 +151,15 @@ public class QueryUtils { * If neither are null then we combine with a BooleanQuery. */ public static Query combineQueryAndFilter(Query scoreQuery, Query filterQuery) { - if (scoreQuery == null) { + // check for *:* is simple and avoids needless BooleanQuery wrapper even though BQ.rewrite optimizes this away + if (scoreQuery == null || scoreQuery instanceof MatchAllDocsQuery) { if (filterQuery == null) { return new MatchAllDocsQuery(); // default if nothing -- match everything } else { return new ConstantScoreQuery(filterQuery); } } else { - if (filterQuery == null) { + if (filterQuery == null || filterQuery instanceof MatchAllDocsQuery) { return scoreQuery; } else { return new BooleanQuery.Builder() diff --git a/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java b/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java index 0deb7cfe039..9e5e2317ab1 100644 --- a/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java +++ b/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java @@ -50,7 +50,6 @@ import org.apache.lucene.index.Term; import org.apache.lucene.index.Terms; import org.apache.lucene.index.TermsEnum; import org.apache.lucene.search.*; -import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.store.Directory; import org.apache.lucene.util.Bits; import org.apache.lucene.util.BytesRef; @@ -894,12 +893,7 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable, SolrI collector = pf.postFilter; } - if (pf.filter != null) { - Query query = new BooleanQuery.Builder().add(main, Occur.MUST).add(pf.filter, Occur.FILTER).build(); - search(query, collector); - } else { - search(main, collector); - } + search(QueryUtils.combineQueryAndFilter(main, pf.filter), collector); if (collector instanceof DelegatingCollector) { ((DelegatingCollector) collector).finish(); @@ -1584,10 +1578,8 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable, SolrI boolean needScores = (cmd.getFlags() & GET_SCORES) != 0; - Query query = QueryUtils.makeQueryable(cmd.getQuery()); - ProcessedFilter pf = getProcessedFilter(cmd.getFilter(), cmd.getFilterList()); - query = QueryUtils.combineQueryAndFilter(query, pf.filter); + final Query query = QueryUtils.combineQueryAndFilter(QueryUtils.makeQueryable(cmd.getQuery()), pf.filter); // handle zero case... if (lastDocRequested <= 0) { @@ -1691,10 +1683,7 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable, SolrI int maxDoc = maxDoc(); ProcessedFilter pf = getProcessedFilter(cmd.getFilter(), cmd.getFilterList()); - Query query = QueryUtils.makeQueryable(cmd.getQuery()); - if (pf.filter != null) { - query = new BooleanQuery.Builder().add(query, Occur.MUST).add(pf.filter, Occur.FILTER).build(); - } + final Query query = QueryUtils.combineQueryAndFilter(QueryUtils.makeQueryable(cmd.getQuery()), pf.filter); // handle zero case... if (lastDocRequested <= 0) {