Skip to content

Commit cc6730f

Browse files
committed
Add prefilters only once in the compound and text similarity retrievers (#114983)
This change ensures that the prefilters are propagated in the downstream retrievers only once. It also removes the ability to extends `explainQuery` in the compound retriever. This is not needed as the rank docs are now responsible for the explanation.
1 parent 186a15b commit cc6730f

File tree

2 files changed

+7
-30
lines changed

2 files changed

+7
-30
lines changed

server/src/main/java/org/elasticsearch/search/retriever/CompoundRetrieverBuilder.java

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import org.elasticsearch.action.search.SearchRequest;
1919
import org.elasticsearch.action.search.SearchResponse;
2020
import org.elasticsearch.action.search.TransportMultiSearchAction;
21-
import org.elasticsearch.index.query.BoolQueryBuilder;
2221
import org.elasticsearch.index.query.QueryBuilder;
2322
import org.elasticsearch.index.query.QueryRewriteContext;
2423
import org.elasticsearch.search.builder.PointInTimeBuilder;
@@ -163,6 +162,11 @@ public final QueryBuilder topDocsQuery() {
163162
throw new IllegalStateException("Should not be called, missing a rewrite?");
164163
}
165164

165+
@Override
166+
public final QueryBuilder explainQuery() {
167+
throw new IllegalStateException("Should not be called, missing a rewrite?");
168+
}
169+
166170
@Override
167171
public final void extractToSearchSourceBuilder(SearchSourceBuilder searchSourceBuilder, boolean compoundUsed) {
168172
throw new IllegalStateException("Should not be called, missing a rewrite?");
@@ -216,22 +220,12 @@ protected SearchSourceBuilder createSearchSourceBuilder(PointInTimeBuilder pit,
216220
.trackTotalHits(false)
217221
.storedFields(new StoredFieldsContext(false))
218222
.size(rankWindowSize);
223+
// apply the pre-filters downstream once
219224
if (preFilterQueryBuilders.isEmpty() == false) {
220225
retrieverBuilder.getPreFilterQueryBuilders().addAll(preFilterQueryBuilders);
221226
}
222227
retrieverBuilder.extractToSearchSourceBuilder(sourceBuilder, true);
223228

224-
// apply the pre-filters
225-
if (preFilterQueryBuilders.size() > 0) {
226-
QueryBuilder query = sourceBuilder.query();
227-
BoolQueryBuilder newQuery = new BoolQueryBuilder();
228-
if (query != null) {
229-
newQuery.must(query);
230-
}
231-
preFilterQueryBuilders.forEach(newQuery::filter);
232-
sourceBuilder.query(newQuery);
233-
}
234-
235229
// Record the shard id in the sort result
236230
List<SortBuilder<?>> sortBuilders = sourceBuilder.sorts() != null ? new ArrayList<>(sourceBuilder.sorts()) : new ArrayList<>();
237231
if (sortBuilders.isEmpty()) {

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/rank/textsimilarity/TextSimilarityRankRetrieverBuilder.java

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import org.apache.lucene.search.ScoreDoc;
1111
import org.elasticsearch.common.ParsingException;
1212
import org.elasticsearch.features.NodeFeature;
13-
import org.elasticsearch.index.query.BoolQueryBuilder;
1413
import org.elasticsearch.index.query.QueryBuilder;
1514
import org.elasticsearch.license.LicenseUtils;
1615
import org.elasticsearch.search.builder.PointInTimeBuilder;
@@ -20,7 +19,6 @@
2019
import org.elasticsearch.search.retriever.CompoundRetrieverBuilder;
2120
import org.elasticsearch.search.retriever.RetrieverBuilder;
2221
import org.elasticsearch.search.retriever.RetrieverParserContext;
23-
import org.elasticsearch.search.retriever.rankdoc.RankDocsQueryBuilder;
2422
import org.elasticsearch.xcontent.ConstructingObjectParser;
2523
import org.elasticsearch.xcontent.ParseField;
2624
import org.elasticsearch.xcontent.XContentBuilder;
@@ -158,33 +156,18 @@ protected RankDoc[] combineInnerRetrieverResults(List<ScoreDoc[]> rankResults) {
158156
return textSimilarityRankDocs;
159157
}
160158

161-
@Override
162-
public QueryBuilder explainQuery() {
163-
// the original matching set of the TextSimilarityRank retriever is specified by its nested retriever
164-
return new RankDocsQueryBuilder(rankDocs, new QueryBuilder[] { innerRetrievers.get(0).retriever().explainQuery() }, true);
165-
}
166-
167159
@Override
168160
protected SearchSourceBuilder createSearchSourceBuilder(PointInTimeBuilder pit, RetrieverBuilder retrieverBuilder) {
169161
var sourceBuilder = new SearchSourceBuilder().pointInTimeBuilder(pit)
170162
.trackTotalHits(false)
171163
.storedFields(new StoredFieldsContext(false))
172164
.size(rankWindowSize);
165+
// apply the pre-filters downstream once
173166
if (preFilterQueryBuilders.isEmpty() == false) {
174167
retrieverBuilder.getPreFilterQueryBuilders().addAll(preFilterQueryBuilders);
175168
}
176169
retrieverBuilder.extractToSearchSourceBuilder(sourceBuilder, true);
177170

178-
// apply the pre-filters
179-
if (preFilterQueryBuilders.size() > 0) {
180-
QueryBuilder query = sourceBuilder.query();
181-
BoolQueryBuilder newQuery = new BoolQueryBuilder();
182-
if (query != null) {
183-
newQuery.must(query);
184-
}
185-
preFilterQueryBuilders.forEach(newQuery::filter);
186-
sourceBuilder.query(newQuery);
187-
}
188171
sourceBuilder.rankBuilder(
189172
new TextSimilarityRankBuilder(this.field, this.inferenceId, this.inferenceText, this.rankWindowSize, this.minScore)
190173
);

0 commit comments

Comments
 (0)