Skip to content

Commit acb89de

Browse files
vishnuchilamakuruChristoph Büscher
authored andcommitted
Add Validation for maxQueryTerms to be greater than 0 for MoreLikeThisQuery (#49966)
Adds validation for maxQueryTerms to be greater than 0 for MoreLikeThisQuery and MoreLikeThisQueryBuilder. Closes #49927
1 parent aebc77d commit acb89de

File tree

4 files changed

+29
-1
lines changed

4 files changed

+29
-1
lines changed

server/src/main/java/org/elasticsearch/common/lucene/search/MoreLikeThisQuery.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,9 @@ public int getMaxQueryTerms() {
308308
}
309309

310310
public void setMaxQueryTerms(int maxQueryTerms) {
311+
if (maxQueryTerms <= 0) {
312+
throw new IllegalArgumentException("requires 'maxQueryTerms' to be greater than 0");
313+
}
311314
this.maxQueryTerms = maxQueryTerms;
312315
}
313316

server/src/main/java/org/elasticsearch/index/query/MoreLikeThisQueryBuilder.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,9 @@ public Item[] unlikeItems() {
577577
* Defaults to {@code 25}.
578578
*/
579579
public MoreLikeThisQueryBuilder maxQueryTerms(int maxQueryTerms) {
580+
if (maxQueryTerms <= 0) {
581+
throw new IllegalArgumentException("requires 'maxQueryTerms' to be greater than 0");
582+
}
580583
this.maxQueryTerms = maxQueryTerms;
581584
return this;
582585
}

server/src/test/java/org/elasticsearch/common/lucene/search/morelikethis/MoreLikeThisQueryTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.elasticsearch.common.lucene.search.MoreLikeThisQuery;
3434
import org.elasticsearch.test.ESTestCase;
3535

36+
import static org.hamcrest.Matchers.containsString;
3637
import static org.hamcrest.Matchers.equalTo;
3738

3839
public class MoreLikeThisQueryTests extends ESTestCase {
@@ -64,4 +65,15 @@ public void testSimple() throws Exception {
6465
reader.close();
6566
indexWriter.close();
6667
}
68+
69+
public void testValidateMaxQueryTerms() {
70+
IllegalArgumentException e1 = expectThrows(IllegalArgumentException.class,
71+
() -> new MoreLikeThisQuery("lucene", new String[]{"text"}, Lucene.STANDARD_ANALYZER).setMaxQueryTerms(0));
72+
assertThat(e1.getMessage(), containsString("requires 'maxQueryTerms' to be greater than 0"));
73+
74+
IllegalArgumentException e2 = expectThrows(IllegalArgumentException.class,
75+
() -> new MoreLikeThisQuery("lucene", new String[]{"text"}, Lucene.STANDARD_ANALYZER).setMaxQueryTerms(-3));
76+
assertThat(e2.getMessage(), containsString("requires 'maxQueryTerms' to be greater than 0"));
77+
}
78+
6779
}

server/src/test/java/org/elasticsearch/index/query/MoreLikeThisQueryBuilderTests.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ protected MoreLikeThisQueryBuilder doCreateTestQueryBuilder() {
163163
queryBuilder.unlike(randomUnlikeItems);
164164
}
165165
if (randomBoolean()) {
166-
queryBuilder.maxQueryTerms(randomInt(25));
166+
queryBuilder.maxQueryTerms(randomIntBetween(1, 25));
167167
}
168168
if (randomBoolean()) {
169169
queryBuilder.minTermFreq(randomInt(5));
@@ -340,6 +340,16 @@ public void testMoreLikeThisBuilder() throws Exception {
340340
assertThat(mltQuery.getMaxQueryTerms(), equalTo(12));
341341
}
342342

343+
public void testValidateMaxQueryTerms() {
344+
IllegalArgumentException e1 = expectThrows(IllegalArgumentException.class,
345+
() -> new MoreLikeThisQueryBuilder(new String[]{"name.first", "name.last"}, new String[]{"something"}, null).maxQueryTerms(0));
346+
assertThat(e1.getMessage(), containsString("requires 'maxQueryTerms' to be greater than 0"));
347+
348+
IllegalArgumentException e2 = expectThrows(IllegalArgumentException.class,
349+
() -> new MoreLikeThisQueryBuilder(new String[]{"name.first", "name.last"}, new String[]{"something"}, null).maxQueryTerms(-3));
350+
assertThat(e2.getMessage(), containsString("requires 'maxQueryTerms' to be greater than 0"));
351+
}
352+
343353
public void testItemSerialization() throws IOException {
344354
Item expectedItem = generateRandomItem();
345355
BytesStreamOutput output = new BytesStreamOutput();

0 commit comments

Comments
 (0)