|
|
@@ -78,10 +78,10 @@ public class TermsSetQueryBuilderTests extends AbstractQueryTestCase<TermsSetQue
|
|
|
String fieldName = randomValueOtherThanMany(value -> value.equals(GEO_POINT_FIELD_NAME), () -> randomFrom(MAPPED_FIELD_NAMES));
|
|
|
List<?> randomTerms = randomValues(fieldName);
|
|
|
TermsSetQueryBuilder queryBuilder = new TermsSetQueryBuilder(TEXT_FIELD_NAME, randomTerms);
|
|
|
- if (randomBoolean()) {
|
|
|
- queryBuilder.setMinimumShouldMatchField("m_s_m");
|
|
|
- } else {
|
|
|
- queryBuilder.setMinimumShouldMatchScript(new Script(ScriptType.INLINE, MockScriptEngine.NAME, "_script", emptyMap()));
|
|
|
+ switch (randomIntBetween(0, 2)) {
|
|
|
+ case 0 -> queryBuilder.setMinimumShouldMatchField("m_s_m");
|
|
|
+ case 1 -> queryBuilder.setMinimumShouldMatchScript(new Script(ScriptType.INLINE, MockScriptEngine.NAME, "_script", emptyMap()));
|
|
|
+ case 2 -> queryBuilder.setMinimumShouldMatch("2");
|
|
|
}
|
|
|
return queryBuilder;
|
|
|
}
|
|
|
@@ -104,7 +104,8 @@ public class TermsSetQueryBuilderTests extends AbstractQueryTestCase<TermsSetQue
|
|
|
public void testCacheability() throws IOException {
|
|
|
TermsSetQueryBuilder queryBuilder = createTestQueryBuilder();
|
|
|
boolean isCacheable = queryBuilder.getMinimumShouldMatchField() != null
|
|
|
- || (queryBuilder.getMinimumShouldMatchScript() != null && queryBuilder.getValues().isEmpty());
|
|
|
+ || (queryBuilder.getMinimumShouldMatchScript() != null && queryBuilder.getValues().isEmpty())
|
|
|
+ || queryBuilder.getMinimumShouldMatch() != null;
|
|
|
SearchExecutionContext context = createSearchExecutionContext();
|
|
|
rewriteQuery(queryBuilder, new SearchExecutionContext(context));
|
|
|
assertNotNull(queryBuilder.doToQuery(context));
|
|
|
@@ -144,8 +145,9 @@ public class TermsSetQueryBuilderTests extends AbstractQueryTestCase<TermsSetQue
|
|
|
List<?> values = instance.getValues();
|
|
|
String minimumShouldMatchField = null;
|
|
|
Script minimumShouldMatchScript = null;
|
|
|
+ String minimumShouldMatch = null;
|
|
|
|
|
|
- switch (randomIntBetween(0, 3)) {
|
|
|
+ switch (randomIntBetween(0, 4)) {
|
|
|
case 0 -> {
|
|
|
Predicate<String> predicate = s -> s.equals(instance.getFieldName()) == false && s.equals(GEO_POINT_FIELD_NAME) == false;
|
|
|
fieldName = randomValueOtherThanMany(predicate, () -> randomFrom(MAPPED_FIELD_NAMES));
|
|
|
@@ -154,6 +156,7 @@ public class TermsSetQueryBuilderTests extends AbstractQueryTestCase<TermsSetQue
|
|
|
case 1 -> values = randomValues(fieldName);
|
|
|
case 2 -> minimumShouldMatchField = randomAlphaOfLengthBetween(1, 10);
|
|
|
case 3 -> minimumShouldMatchScript = new Script(ScriptType.INLINE, MockScriptEngine.NAME, randomAlphaOfLength(10), emptyMap());
|
|
|
+ case 4 -> minimumShouldMatch = "3";
|
|
|
}
|
|
|
|
|
|
TermsSetQueryBuilder newInstance = new TermsSetQueryBuilder(fieldName, values);
|
|
|
@@ -163,6 +166,9 @@ public class TermsSetQueryBuilderTests extends AbstractQueryTestCase<TermsSetQue
|
|
|
if (minimumShouldMatchScript != null) {
|
|
|
newInstance.setMinimumShouldMatchScript(minimumShouldMatchScript);
|
|
|
}
|
|
|
+ if (minimumShouldMatch != null) {
|
|
|
+ newInstance.setMinimumShouldMatch(minimumShouldMatch);
|
|
|
+ }
|
|
|
return newInstance;
|
|
|
}
|
|
|
|
|
|
@@ -170,10 +176,18 @@ public class TermsSetQueryBuilderTests extends AbstractQueryTestCase<TermsSetQue
|
|
|
TermsSetQueryBuilder queryBuilder = new TermsSetQueryBuilder("_field", Collections.emptyList());
|
|
|
queryBuilder.setMinimumShouldMatchScript(new Script(""));
|
|
|
expectThrows(IllegalArgumentException.class, () -> queryBuilder.setMinimumShouldMatchField("_field"));
|
|
|
+ expectThrows(IllegalArgumentException.class, () -> queryBuilder.setMinimumShouldMatch("2"));
|
|
|
|
|
|
queryBuilder.setMinimumShouldMatchScript(null);
|
|
|
queryBuilder.setMinimumShouldMatchField("_field");
|
|
|
expectThrows(IllegalArgumentException.class, () -> queryBuilder.setMinimumShouldMatchScript(new Script("")));
|
|
|
+ expectThrows(IllegalArgumentException.class, () -> queryBuilder.setMinimumShouldMatch("2"));
|
|
|
+
|
|
|
+ queryBuilder.setMinimumShouldMatchField(null);
|
|
|
+ queryBuilder.setMinimumShouldMatch("2");
|
|
|
+ expectThrows(IllegalArgumentException.class, () -> queryBuilder.setMinimumShouldMatchField("_field"));
|
|
|
+ expectThrows(IllegalArgumentException.class, () -> queryBuilder.setMinimumShouldMatchScript(new Script("")));
|
|
|
+
|
|
|
}
|
|
|
|
|
|
public void testDoToQuery() throws Exception {
|
|
|
@@ -207,21 +221,52 @@ public class TermsSetQueryBuilderTests extends AbstractQueryTestCase<TermsSetQue
|
|
|
iw.addDocument(document);
|
|
|
|
|
|
document = new Document();
|
|
|
- document.add(new TextField("message", "a b c d", Field.Store.NO));
|
|
|
+ document.add(new TextField("message", "a b c d f g", Field.Store.NO));
|
|
|
document.add(new SortedNumericDocValuesField("m_s_m", 3));
|
|
|
iw.addDocument(document);
|
|
|
}
|
|
|
|
|
|
try (IndexReader ir = DirectoryReader.open(directory)) {
|
|
|
SearchExecutionContext context = createSearchExecutionContext();
|
|
|
- Query query = new TermsSetQueryBuilder("message", Arrays.asList("c", "d")).setMinimumShouldMatchField("m_s_m")
|
|
|
+ Query queryWithMinimumShouldMatchField = new TermsSetQueryBuilder("message", Arrays.asList("c", "d"))
|
|
|
+ .setMinimumShouldMatchField("m_s_m")
|
|
|
.doToQuery(context);
|
|
|
IndexSearcher searcher = new IndexSearcher(ir);
|
|
|
- TopDocs topDocs = searcher.search(query, 10, new Sort(SortField.FIELD_DOC));
|
|
|
- assertThat(topDocs.totalHits.value, equalTo(3L));
|
|
|
- assertThat(topDocs.scoreDocs[0].doc, equalTo(1));
|
|
|
- assertThat(topDocs.scoreDocs[1].doc, equalTo(3));
|
|
|
- assertThat(topDocs.scoreDocs[2].doc, equalTo(4));
|
|
|
+ TopDocs topDocsWithMinimumShouldMatchField = searcher.search(
|
|
|
+ queryWithMinimumShouldMatchField,
|
|
|
+ 10,
|
|
|
+ new Sort(SortField.FIELD_DOC)
|
|
|
+ );
|
|
|
+ assertThat(topDocsWithMinimumShouldMatchField.totalHits.value, equalTo(3L));
|
|
|
+ assertThat(topDocsWithMinimumShouldMatchField.scoreDocs[0].doc, equalTo(1));
|
|
|
+ assertThat(topDocsWithMinimumShouldMatchField.scoreDocs[1].doc, equalTo(3));
|
|
|
+ assertThat(topDocsWithMinimumShouldMatchField.scoreDocs[2].doc, equalTo(4));
|
|
|
+
|
|
|
+ context = createSearchExecutionContext();
|
|
|
+ Query queryWithMinimumShouldMatch = new TermsSetQueryBuilder("message", Arrays.asList("c", "d", "a")).setMinimumShouldMatch(
|
|
|
+ "2"
|
|
|
+ ).doToQuery(context);
|
|
|
+ searcher = new IndexSearcher(ir);
|
|
|
+ TopDocs topDocsWithMinimumShouldMatch = searcher.search(queryWithMinimumShouldMatch, 10, new Sort(SortField.FIELD_DOC));
|
|
|
+ assertThat(topDocsWithMinimumShouldMatch.totalHits.value, equalTo(5L));
|
|
|
+ assertThat(topDocsWithMinimumShouldMatch.scoreDocs[0].doc, equalTo(1));
|
|
|
+ assertThat(topDocsWithMinimumShouldMatch.scoreDocs[1].doc, equalTo(2));
|
|
|
+ assertThat(topDocsWithMinimumShouldMatch.scoreDocs[2].doc, equalTo(3));
|
|
|
+ assertThat(topDocsWithMinimumShouldMatch.scoreDocs[3].doc, equalTo(4));
|
|
|
+ assertThat(topDocsWithMinimumShouldMatch.scoreDocs[4].doc, equalTo(5));
|
|
|
+
|
|
|
+ context = createSearchExecutionContext();
|
|
|
+ Query queryWithMinimumShouldMatchNegative = new TermsSetQueryBuilder("message", Arrays.asList("c", "g", "f"))
|
|
|
+ .setMinimumShouldMatch("-1")
|
|
|
+ .doToQuery(context);
|
|
|
+ searcher = new IndexSearcher(ir);
|
|
|
+ TopDocs topDocsWithMinimumShouldMatchNegative = searcher.search(
|
|
|
+ queryWithMinimumShouldMatchNegative,
|
|
|
+ 10,
|
|
|
+ new Sort(SortField.FIELD_DOC)
|
|
|
+ );
|
|
|
+ assertThat(topDocsWithMinimumShouldMatchNegative.totalHits.value, equalTo(1L));
|
|
|
+ assertThat(topDocsWithMinimumShouldMatchNegative.scoreDocs[0].doc, equalTo(5));
|
|
|
}
|
|
|
}
|
|
|
}
|