Merge pull request #16465 from cbuescher/issue-13884-test
Tests: Add test for minimum_should_match for SimpleQueryStringQuery
This commit is contained in:
commit
97172aa2fd
|
@ -1273,7 +1273,6 @@
|
||||||
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]index[/\\]query[/\\]RandomQueryBuilder.java" checks="LineLength" />
|
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]index[/\\]query[/\\]RandomQueryBuilder.java" checks="LineLength" />
|
||||||
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]index[/\\]query[/\\]RangeQueryBuilderTests.java" checks="LineLength" />
|
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]index[/\\]query[/\\]RangeQueryBuilderTests.java" checks="LineLength" />
|
||||||
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]index[/\\]query[/\\]ScoreModeTests.java" checks="LineLength" />
|
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]index[/\\]query[/\\]ScoreModeTests.java" checks="LineLength" />
|
||||||
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]index[/\\]query[/\\]SimpleQueryStringBuilderTests.java" checks="LineLength" />
|
|
||||||
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]index[/\\]query[/\\]SpanMultiTermQueryBuilderTests.java" checks="LineLength" />
|
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]index[/\\]query[/\\]SpanMultiTermQueryBuilderTests.java" checks="LineLength" />
|
||||||
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]index[/\\]query[/\\]SpanNotQueryBuilderTests.java" checks="LineLength" />
|
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]index[/\\]query[/\\]SpanNotQueryBuilderTests.java" checks="LineLength" />
|
||||||
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]index[/\\]query[/\\]functionscore[/\\]FunctionScoreEquivalenceTests.java" checks="LineLength" />
|
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]index[/\\]query[/\\]functionscore[/\\]FunctionScoreEquivalenceTests.java" checks="LineLength" />
|
||||||
|
@ -1447,7 +1446,6 @@
|
||||||
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]search[/\\]query[/\\]ExistsIT.java" checks="LineLength" />
|
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]search[/\\]query[/\\]ExistsIT.java" checks="LineLength" />
|
||||||
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]search[/\\]query[/\\]MultiMatchQueryIT.java" checks="LineLength" />
|
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]search[/\\]query[/\\]MultiMatchQueryIT.java" checks="LineLength" />
|
||||||
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]search[/\\]query[/\\]SearchQueryIT.java" checks="LineLength" />
|
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]search[/\\]query[/\\]SearchQueryIT.java" checks="LineLength" />
|
||||||
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]search[/\\]query[/\\]SimpleQueryStringIT.java" checks="LineLength" />
|
|
||||||
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]search[/\\]rescore[/\\]QueryRescoreBuilderTests.java" checks="LineLength" />
|
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]search[/\\]rescore[/\\]QueryRescoreBuilderTests.java" checks="LineLength" />
|
||||||
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]search[/\\]scroll[/\\]DuelScrollIT.java" checks="LineLength" />
|
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]search[/\\]scroll[/\\]DuelScrollIT.java" checks="LineLength" />
|
||||||
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]search[/\\]scroll[/\\]SearchScrollIT.java" checks="LineLength" />
|
<suppress files="core[/\\]src[/\\]test[/\\]java[/\\]org[/\\]elasticsearch[/\\]search[/\\]scroll[/\\]SearchScrollIT.java" checks="LineLength" />
|
||||||
|
|
|
@ -22,6 +22,7 @@ package org.elasticsearch.index.query;
|
||||||
import com.carrotsearch.randomizedtesting.generators.CodepointSetGenerator;
|
import com.carrotsearch.randomizedtesting.generators.CodepointSetGenerator;
|
||||||
import com.fasterxml.jackson.core.JsonParseException;
|
import com.fasterxml.jackson.core.JsonParseException;
|
||||||
import com.fasterxml.jackson.core.io.JsonStringEncoder;
|
import com.fasterxml.jackson.core.io.JsonStringEncoder;
|
||||||
|
|
||||||
import org.apache.lucene.search.BoostQuery;
|
import org.apache.lucene.search.BoostQuery;
|
||||||
import org.apache.lucene.search.Query;
|
import org.apache.lucene.search.Query;
|
||||||
import org.apache.lucene.search.TermQuery;
|
import org.apache.lucene.search.TermQuery;
|
||||||
|
@ -56,7 +57,6 @@ import org.elasticsearch.common.io.stream.NamedWriteableAwareStreamInput;
|
||||||
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
|
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
|
||||||
import org.elasticsearch.common.io.stream.StreamInput;
|
import org.elasticsearch.common.io.stream.StreamInput;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
import org.elasticsearch.common.settings.SettingsFilter;
|
|
||||||
import org.elasticsearch.common.settings.SettingsModule;
|
import org.elasticsearch.common.settings.SettingsModule;
|
||||||
import org.elasticsearch.common.unit.Fuzziness;
|
import org.elasticsearch.common.unit.Fuzziness;
|
||||||
import org.elasticsearch.common.xcontent.ToXContent;
|
import org.elasticsearch.common.xcontent.ToXContent;
|
||||||
|
@ -89,9 +89,9 @@ import org.elasticsearch.script.ScriptContext;
|
||||||
import org.elasticsearch.script.ScriptContextRegistry;
|
import org.elasticsearch.script.ScriptContextRegistry;
|
||||||
import org.elasticsearch.script.ScriptEngineRegistry;
|
import org.elasticsearch.script.ScriptEngineRegistry;
|
||||||
import org.elasticsearch.script.ScriptEngineService;
|
import org.elasticsearch.script.ScriptEngineService;
|
||||||
import org.elasticsearch.script.ScriptSettings;
|
|
||||||
import org.elasticsearch.script.ScriptModule;
|
import org.elasticsearch.script.ScriptModule;
|
||||||
import org.elasticsearch.script.ScriptService;
|
import org.elasticsearch.script.ScriptService;
|
||||||
|
import org.elasticsearch.script.ScriptSettings;
|
||||||
import org.elasticsearch.search.SearchModule;
|
import org.elasticsearch.search.SearchModule;
|
||||||
import org.elasticsearch.search.internal.SearchContext;
|
import org.elasticsearch.search.internal.SearchContext;
|
||||||
import org.elasticsearch.test.ESTestCase;
|
import org.elasticsearch.test.ESTestCase;
|
||||||
|
|
|
@ -297,7 +297,8 @@ public class SimpleQueryStringBuilderTests extends AbstractQueryTestCase<SimpleQ
|
||||||
} else if (queryBuilder.fields().size() == 0) {
|
} else if (queryBuilder.fields().size() == 0) {
|
||||||
assertTermQuery(query, MetaData.ALL, queryBuilder.value());
|
assertTermQuery(query, MetaData.ALL, queryBuilder.value());
|
||||||
} else {
|
} else {
|
||||||
fail("Encountered lucene query type we do not have a validation implementation for in our " + SimpleQueryStringBuilderTests.class.getSimpleName());
|
fail("Encountered lucene query type we do not have a validation implementation for in our "
|
||||||
|
+ SimpleQueryStringBuilderTests.class.getSimpleName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -368,4 +369,37 @@ public class SimpleQueryStringBuilderTests extends AbstractQueryTestCase<SimpleQ
|
||||||
assertEquals(json, 2, parsed.fields().size());
|
assertEquals(json, 2, parsed.fields().size());
|
||||||
assertEquals(json, "snowball", parsed.analyzer());
|
assertEquals(json, "snowball", parsed.analyzer());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testMinimumShouldMatch() throws IOException {
|
||||||
|
QueryShardContext shardContext = createShardContext();
|
||||||
|
int numberOfTerms = randomIntBetween(1, 4);
|
||||||
|
StringBuilder queryString = new StringBuilder();
|
||||||
|
for (int i = 0; i < numberOfTerms; i++) {
|
||||||
|
queryString.append("t" + i + " ");
|
||||||
|
}
|
||||||
|
SimpleQueryStringBuilder simpleQueryStringBuilder = new SimpleQueryStringBuilder(queryString.toString().trim());
|
||||||
|
if (randomBoolean()) {
|
||||||
|
simpleQueryStringBuilder.defaultOperator(Operator.AND);
|
||||||
|
}
|
||||||
|
int numberOfFields = randomIntBetween(1, 4);
|
||||||
|
for (int i = 0; i < numberOfFields; i++) {
|
||||||
|
simpleQueryStringBuilder.field("f" + i);
|
||||||
|
}
|
||||||
|
int percent = randomIntBetween(1, 100);
|
||||||
|
simpleQueryStringBuilder.minimumShouldMatch(percent + "%");
|
||||||
|
Query query = simpleQueryStringBuilder.toQuery(shardContext);
|
||||||
|
|
||||||
|
// check special case: one term & one field should get simplified to a TermQuery
|
||||||
|
if (numberOfFields * numberOfTerms == 1) {
|
||||||
|
assertThat(query, instanceOf(TermQuery.class));
|
||||||
|
} else {
|
||||||
|
assertThat(query, instanceOf(BooleanQuery.class));
|
||||||
|
BooleanQuery boolQuery = (BooleanQuery) query;
|
||||||
|
int expectedMinimumShouldMatch = numberOfTerms * percent / 100;
|
||||||
|
if (simpleQueryStringBuilder.defaultOperator().equals(Operator.AND) && numberOfTerms > 1) {
|
||||||
|
expectedMinimumShouldMatch = 0;
|
||||||
|
}
|
||||||
|
assertEquals(expectedMinimumShouldMatch, boolQuery.getMinimumNumberShouldMatch());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -116,12 +116,21 @@ public class SimpleQueryStringIT extends ESIntegTestCase {
|
||||||
assertSearchHits(searchResponse, "3", "4");
|
assertSearchHits(searchResponse, "3", "4");
|
||||||
|
|
||||||
logger.info("--> query 2");
|
logger.info("--> query 2");
|
||||||
searchResponse = client().prepareSearch().setQuery(simpleQueryStringQuery("foo bar").field("body").field("body2").minimumShouldMatch("2")).get();
|
searchResponse = client().prepareSearch()
|
||||||
|
.setQuery(simpleQueryStringQuery("foo bar").field("body").field("body2").minimumShouldMatch("2")).get();
|
||||||
assertHitCount(searchResponse, 2L);
|
assertHitCount(searchResponse, 2L);
|
||||||
assertSearchHits(searchResponse, "3", "4");
|
assertSearchHits(searchResponse, "3", "4");
|
||||||
|
|
||||||
|
// test case from #13884
|
||||||
logger.info("--> query 3");
|
logger.info("--> query 3");
|
||||||
searchResponse = client().prepareSearch().setQuery(simpleQueryStringQuery("foo bar baz").field("body").field("body2").minimumShouldMatch("70%")).get();
|
searchResponse = client().prepareSearch().setQuery(simpleQueryStringQuery("foo")
|
||||||
|
.field("body").field("body2").field("body3").minimumShouldMatch("-50%")).get();
|
||||||
|
assertHitCount(searchResponse, 3L);
|
||||||
|
assertSearchHits(searchResponse, "1", "3", "4");
|
||||||
|
|
||||||
|
logger.info("--> query 4");
|
||||||
|
searchResponse = client().prepareSearch()
|
||||||
|
.setQuery(simpleQueryStringQuery("foo bar baz").field("body").field("body2").minimumShouldMatch("70%")).get();
|
||||||
assertHitCount(searchResponse, 2L);
|
assertHitCount(searchResponse, 2L);
|
||||||
assertSearchHits(searchResponse, "3", "4");
|
assertSearchHits(searchResponse, "3", "4");
|
||||||
|
|
||||||
|
@ -131,18 +140,20 @@ public class SimpleQueryStringIT extends ESIntegTestCase {
|
||||||
client().prepareIndex("test", "type1", "7").setSource("body2", "foo bar", "other", "foo"),
|
client().prepareIndex("test", "type1", "7").setSource("body2", "foo bar", "other", "foo"),
|
||||||
client().prepareIndex("test", "type1", "8").setSource("body2", "foo baz bar", "other", "foo"));
|
client().prepareIndex("test", "type1", "8").setSource("body2", "foo baz bar", "other", "foo"));
|
||||||
|
|
||||||
logger.info("--> query 4");
|
logger.info("--> query 5");
|
||||||
searchResponse = client().prepareSearch().setQuery(simpleQueryStringQuery("foo bar").field("body").field("body2").minimumShouldMatch("2")).get();
|
searchResponse = client().prepareSearch()
|
||||||
|
.setQuery(simpleQueryStringQuery("foo bar").field("body").field("body2").minimumShouldMatch("2")).get();
|
||||||
assertHitCount(searchResponse, 4L);
|
assertHitCount(searchResponse, 4L);
|
||||||
assertSearchHits(searchResponse, "3", "4", "7", "8");
|
assertSearchHits(searchResponse, "3", "4", "7", "8");
|
||||||
|
|
||||||
logger.info("--> query 5");
|
logger.info("--> query 6");
|
||||||
searchResponse = client().prepareSearch().setQuery(simpleQueryStringQuery("foo bar").minimumShouldMatch("2")).get();
|
searchResponse = client().prepareSearch().setQuery(simpleQueryStringQuery("foo bar").minimumShouldMatch("2")).get();
|
||||||
assertHitCount(searchResponse, 5L);
|
assertHitCount(searchResponse, 5L);
|
||||||
assertSearchHits(searchResponse, "3", "4", "6", "7", "8");
|
assertSearchHits(searchResponse, "3", "4", "6", "7", "8");
|
||||||
|
|
||||||
logger.info("--> query 6");
|
logger.info("--> query 7");
|
||||||
searchResponse = client().prepareSearch().setQuery(simpleQueryStringQuery("foo bar baz").field("body2").field("other").minimumShouldMatch("70%")).get();
|
searchResponse = client().prepareSearch()
|
||||||
|
.setQuery(simpleQueryStringQuery("foo bar baz").field("body2").field("other").minimumShouldMatch("70%")).get();
|
||||||
assertHitCount(searchResponse, 3L);
|
assertHitCount(searchResponse, 3L);
|
||||||
assertSearchHits(searchResponse, "6", "7", "8");
|
assertSearchHits(searchResponse, "6", "7", "8");
|
||||||
}
|
}
|
||||||
|
@ -330,7 +341,8 @@ public class SimpleQueryStringIT extends ESIntegTestCase {
|
||||||
indexRandom(true, client().prepareIndex("test1", "type1", "1").setSource("location", "Köln"));
|
indexRandom(true, client().prepareIndex("test1", "type1", "1").setSource("location", "Köln"));
|
||||||
refresh();
|
refresh();
|
||||||
|
|
||||||
SearchResponse searchResponse = client().prepareSearch().setQuery(simpleQueryStringQuery("Köln*").analyzeWildcard(true).field("location")).get();
|
SearchResponse searchResponse = client().prepareSearch()
|
||||||
|
.setQuery(simpleQueryStringQuery("Köln*").analyzeWildcard(true).field("location")).get();
|
||||||
assertNoFailures(searchResponse);
|
assertNoFailures(searchResponse);
|
||||||
assertHitCount(searchResponse, 1L);
|
assertHitCount(searchResponse, 1L);
|
||||||
assertSearchHits(searchResponse, "1");
|
assertSearchHits(searchResponse, "1");
|
||||||
|
|
Loading…
Reference in New Issue