Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions docs/changelog/122575.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
pr: 122575
summary: Return an empty suggestion when suggest phase times out
area: Suggesters
type: bug
issues:
- 122548
3 changes: 0 additions & 3 deletions muted-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -323,9 +323,6 @@ tests:
- class: org.elasticsearch.compute.operator.exchange.ExchangeServiceTests
method: testExchangeSourceContinueOnFailure
issue: https://github.com/elastic/elasticsearch/issues/122408
- class: org.elasticsearch.search.SearchTimeoutIT
method: testSuggestTimeoutWithPartialResults
issue: https://github.com/elastic/elasticsearch/issues/122548
- class: org.elasticsearch.repositories.blobstore.testkit.analyze.MinioRepositoryAnalysisRestIT
method: testRepositoryAnalysis
issue: https://github.com/elastic/elasticsearch/issues/122670
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -484,8 +484,7 @@ protected TermSuggestion innerExecute(
CharsRefBuilder spare
) {
contextIndexSearcher.throwTimeExceededException();
assert false;
return new TermSuggestion(name, suggestion.getSize(), SortBy.SCORE);
throw new AssertionError("should have thrown TimeExceededException");
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,15 +126,7 @@ static void executeRank(SearchContext searchContext) throws QueryPhaseExecutionE

static void executeQuery(SearchContext searchContext) throws QueryPhaseExecutionException {
if (searchContext.hasOnlySuggest()) {
try {
SuggestPhase.execute(searchContext);
} catch (ContextIndexSearcher.TimeExceededException timeExceededException) {
SearchTimeoutException.handleTimeout(
searchContext.request().allowPartialSearchResults(),
searchContext.shardTarget(),
searchContext.queryResult()
);
}
SuggestPhase.execute(searchContext);
searchContext.queryResult().topDocs(new TopDocsAndMaxScore(Lucene.EMPTY_TOP_DOCS, Float.NaN), new DocValueFormat[0]);
return;
}
Expand All @@ -150,18 +142,10 @@ static void executeQuery(SearchContext searchContext) throws QueryPhaseExecution

addCollectorsAndSearch(searchContext);

try {
RescorePhase.execute(searchContext);
SuggestPhase.execute(searchContext);
if (searchContext.getProfilers() != null) {
searchContext.queryResult().profileResults(searchContext.getProfilers().buildQueryPhaseResults());
}
} catch (ContextIndexSearcher.TimeExceededException timeExceededException) {
SearchTimeoutException.handleTimeout(
searchContext.request().allowPartialSearchResults(),
searchContext.shardTarget(),
searchContext.queryResult()
);
RescorePhase.execute(searchContext);
SuggestPhase.execute(searchContext);
if (searchContext.getProfilers() != null) {
searchContext.queryResult().profileResults(searchContext.getProfilers().buildQueryPhaseResults());
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@
import org.elasticsearch.common.lucene.search.TopDocsAndMaxScore;
import org.elasticsearch.common.util.Maps;
import org.elasticsearch.lucene.grouping.TopFieldGroups;
import org.elasticsearch.search.internal.ContextIndexSearcher;
import org.elasticsearch.search.internal.SearchContext;
import org.elasticsearch.search.query.SearchTimeoutException;
import org.elasticsearch.search.sort.ShardDocSortField;
import org.elasticsearch.search.sort.SortAndFormats;

Expand Down Expand Up @@ -84,6 +86,13 @@ public static void execute(SearchContext context) {
.topDocs(new TopDocsAndMaxScore(topDocs, topDocs.scoreDocs[0].score), context.queryResult().sortValueFormats());
} catch (IOException e) {
throw new ElasticsearchException("Rescore Phase Failed", e);
} catch (ContextIndexSearcher.TimeExceededException timeExceededException) {
SearchTimeoutException.handleTimeout(
context.request().allowPartialSearchResults(),
context.shardTarget(),
context.queryResult()
);
// if the rescore phase times out and partial results are allowed, the returned top docs from this shard won't be rescored
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@

import org.apache.lucene.util.CharsRefBuilder;
import org.elasticsearch.ElasticsearchException;
import org.elasticsearch.search.internal.ContextIndexSearcher;
import org.elasticsearch.search.internal.SearchContext;
import org.elasticsearch.search.query.SearchTimeoutException;
import org.elasticsearch.search.suggest.Suggest.Suggestion;
import org.elasticsearch.search.suggest.Suggest.Suggestion.Entry;
import org.elasticsearch.search.suggest.Suggest.Suggestion.Entry.Option;
Expand Down Expand Up @@ -40,12 +42,17 @@ public static void execute(SearchContext context) {
for (Map.Entry<String, SuggestionSearchContext.SuggestionContext> entry : suggest.suggestions().entrySet()) {
SuggestionSearchContext.SuggestionContext suggestion = entry.getValue();
Suggester<SuggestionContext> suggester = suggestion.getSuggester();
Suggestion<? extends Entry<? extends Option>> result = suggester.execute(
entry.getKey(),
suggestion,
context.searcher(),
spare
);
Suggestion<? extends Entry<? extends Option>> result;
try {
result = suggester.execute(entry.getKey(), suggestion, context.searcher(), spare);
} catch (ContextIndexSearcher.TimeExceededException timeExceededException) {
SearchTimeoutException.handleTimeout(
context.request().allowPartialSearchResults(),
context.shardTarget(),
context.queryResult()
);
result = suggester.emptySuggestion(entry.getKey(), suggestion, spare);
}
if (result != null) {
assert entry.getKey().equals(result.name);
suggestions.add(result);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -297,7 +297,8 @@ public void testSuggestOnlyWithTimeout() throws Exception {
assertTrue(context.hasOnlySuggest());
QueryPhase.execute(context);
assertTrue(context.queryResult().searchTimedOut());
assertNull(context.queryResult().suggest());
assertEquals(1, context.queryResult().suggest().size());
assertEquals(0, context.queryResult().suggest().getSuggestion("suggestion").getEntries().size());
assertNotNull(context.queryResult().topDocs());
assertEquals(0, context.queryResult().topDocs().topDocs.totalHits.value());
}
Expand All @@ -311,7 +312,8 @@ public void testSuggestAndQueryWithSuggestTimeout() throws Exception {
QueryPhase.execute(context);
assertThat(context.queryResult().topDocs().topDocs.totalHits.value(), Matchers.greaterThan(0L));
assertTrue(context.queryResult().searchTimedOut());
assertNull(context.queryResult().suggest());
assertEquals(1, context.queryResult().suggest().size());
assertEquals(0, context.queryResult().suggest().getSuggestion("suggestion").getEntries().size());
}
}

Expand Down