diff --git a/docs/changelog/124662.yaml b/docs/changelog/124662.yaml new file mode 100644 index 0000000000000..e6444eff17ddb --- /dev/null +++ b/docs/changelog/124662.yaml @@ -0,0 +1,6 @@ +pr: 124662 +summary: Let MLTQuery throw IAE when no analyzer is set +area: Search +type: bug +issues: + - 124562 diff --git a/server/src/main/java/org/elasticsearch/index/query/MoreLikeThisQueryBuilder.java b/server/src/main/java/org/elasticsearch/index/query/MoreLikeThisQueryBuilder.java index 30b6134650524..54dab4f9716f0 100644 --- a/server/src/main/java/org/elasticsearch/index/query/MoreLikeThisQueryBuilder.java +++ b/server/src/main/java/org/elasticsearch/index/query/MoreLikeThisQueryBuilder.java @@ -911,9 +911,7 @@ protected Query doToQuery(SearchExecutionContext context) throws IOException { // set analyzer Analyzer analyzerObj = context.getIndexAnalyzers().get(analyzer); if (analyzerObj == null) { - analyzerObj = context.getIndexAnalyzer( - f -> { throw new UnsupportedOperationException("No analyzer configured for field " + f); } - ); + analyzerObj = context.getIndexAnalyzer(f -> { throw new IllegalArgumentException("No analyzer configured for field " + f); }); } mltQuery.setAnalyzer(analyzer, analyzerObj); diff --git a/server/src/test/java/org/elasticsearch/index/query/MoreLikeThisQueryBuilderTests.java b/server/src/test/java/org/elasticsearch/index/query/MoreLikeThisQueryBuilderTests.java index 7c21751b4b332..e5c7b4dfa628c 100644 --- a/server/src/test/java/org/elasticsearch/index/query/MoreLikeThisQueryBuilderTests.java +++ b/server/src/test/java/org/elasticsearch/index/query/MoreLikeThisQueryBuilderTests.java @@ -9,6 +9,7 @@ package org.elasticsearch.index.query; +import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.core.WhitespaceAnalyzer; import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; @@ -41,6 +42,7 @@ import org.junit.Before; import java.io.IOException; +import java.io.StringReader; import java.util.Arrays; import java.util.Collections; import java.util.EnumSet; @@ -393,6 +395,19 @@ public void testItemFromXContent() throws IOException { assertEquals(expectedItem, newItem); } + public void testNonExistingAnalyzer() throws IOException { + MoreLikeThisQueryBuilder moreLikeThisQueryBuilder = moreLikeThisQuery( + new String[] { "name.first", "name.last" }, + new String[] { "something" }, + null + ); + moreLikeThisQueryBuilder.analyzer("thisDoesntExist"); + SearchExecutionContext searchExecutionContext = createSearchExecutionContext(); + Query query = moreLikeThisQueryBuilder.toQuery(searchExecutionContext); + Analyzer analyzer = ((MoreLikeThisQuery) query).getAnalyzer(); + assertThrows(IllegalArgumentException.class, () -> analyzer.tokenStream("thisDoesntExist", new StringReader("something"))); + } + /** * Check that this query is generally not cacheable, except when we fetch 0 items */