query_string_query should take term length into consideration when fuzziness is auto
Fixes #15972
This commit is contained in:
parent
28d7ebe8f8
commit
3a13f54755
|
@ -102,7 +102,6 @@ public class MapperQueryParser extends QueryParser {
|
||||||
setLowercaseExpandedTerms(settings.lowercaseExpandedTerms());
|
setLowercaseExpandedTerms(settings.lowercaseExpandedTerms());
|
||||||
setPhraseSlop(settings.phraseSlop());
|
setPhraseSlop(settings.phraseSlop());
|
||||||
setDefaultOperator(settings.defaultOperator());
|
setDefaultOperator(settings.defaultOperator());
|
||||||
setFuzzyMinSim(settings.fuzziness().asFloat());
|
|
||||||
setFuzzyPrefixLength(settings.fuzzyPrefixLength());
|
setFuzzyPrefixLength(settings.fuzzyPrefixLength());
|
||||||
setLocale(settings.locale());
|
setLocale(settings.locale());
|
||||||
}
|
}
|
||||||
|
@ -114,7 +113,7 @@ public class MapperQueryParser extends QueryParser {
|
||||||
@Override
|
@Override
|
||||||
Query handleBareFuzzy(String qfield, Token fuzzySlop, String termImage) throws ParseException {
|
Query handleBareFuzzy(String qfield, Token fuzzySlop, String termImage) throws ParseException {
|
||||||
if (fuzzySlop.image.length() == 1) {
|
if (fuzzySlop.image.length() == 1) {
|
||||||
return getFuzzyQuery(qfield, termImage, Float.toString(fuzzyMinSim));
|
return getFuzzyQuery(qfield, termImage, Float.toString(settings.fuzziness().asDistance(termImage)));
|
||||||
}
|
}
|
||||||
return getFuzzyQuery(qfield, termImage, fuzzySlop.image.substring(1));
|
return getFuzzyQuery(qfield, termImage, fuzzySlop.image.substring(1));
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,15 +26,16 @@ import org.apache.lucene.search.BooleanClause;
|
||||||
import org.apache.lucene.search.BooleanQuery;
|
import org.apache.lucene.search.BooleanQuery;
|
||||||
import org.apache.lucene.search.BoostQuery;
|
import org.apache.lucene.search.BoostQuery;
|
||||||
import org.apache.lucene.search.DisjunctionMaxQuery;
|
import org.apache.lucene.search.DisjunctionMaxQuery;
|
||||||
|
import org.apache.lucene.search.FuzzyQuery;
|
||||||
import org.apache.lucene.search.MatchAllDocsQuery;
|
import org.apache.lucene.search.MatchAllDocsQuery;
|
||||||
import org.apache.lucene.search.MatchNoDocsQuery;
|
import org.apache.lucene.search.MatchNoDocsQuery;
|
||||||
|
import org.apache.lucene.search.MultiTermQuery;
|
||||||
import org.apache.lucene.search.PhraseQuery;
|
import org.apache.lucene.search.PhraseQuery;
|
||||||
|
import org.apache.lucene.search.PrefixQuery;
|
||||||
import org.apache.lucene.search.Query;
|
import org.apache.lucene.search.Query;
|
||||||
import org.apache.lucene.search.RegexpQuery;
|
import org.apache.lucene.search.RegexpQuery;
|
||||||
import org.apache.lucene.search.TermQuery;
|
|
||||||
import org.apache.lucene.search.SynonymQuery;
|
import org.apache.lucene.search.SynonymQuery;
|
||||||
import org.apache.lucene.search.PrefixQuery;
|
import org.apache.lucene.search.TermQuery;
|
||||||
import org.apache.lucene.search.MultiTermQuery;
|
|
||||||
import org.apache.lucene.util.automaton.TooComplexToDeterminizeException;
|
import org.apache.lucene.util.automaton.TooComplexToDeterminizeException;
|
||||||
import org.elasticsearch.common.lucene.all.AllTermQuery;
|
import org.elasticsearch.common.lucene.all.AllTermQuery;
|
||||||
import org.elasticsearch.common.unit.Fuzziness;
|
import org.elasticsearch.common.unit.Fuzziness;
|
||||||
|
@ -390,6 +391,32 @@ public class QueryStringQueryBuilderTests extends AbstractQueryTestCase<QueryStr
|
||||||
assertThat(e.getMessage(), containsString("would result in more than 10000 states"));
|
assertThat(e.getMessage(), containsString("would result in more than 10000 states"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testToQueryFuzzyQueryAutoFuziness() throws Exception {
|
||||||
|
assumeTrue("test runs only when at least a type is registered", getCurrentTypes().length > 0);
|
||||||
|
|
||||||
|
int length = randomIntBetween(1, 10);
|
||||||
|
StringBuilder queryString = new StringBuilder();
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
queryString.append("a");
|
||||||
|
}
|
||||||
|
queryString.append("~");
|
||||||
|
|
||||||
|
int expectedEdits;
|
||||||
|
if (length <= 2) {
|
||||||
|
expectedEdits = 0;
|
||||||
|
} else if (3 <= length && length <= 5) {
|
||||||
|
expectedEdits = 1;
|
||||||
|
} else {
|
||||||
|
expectedEdits = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
Query query = queryStringQuery(queryString.toString()).defaultField(STRING_FIELD_NAME).fuzziness(Fuzziness.AUTO)
|
||||||
|
.toQuery(createShardContext());
|
||||||
|
assertThat(query, instanceOf(FuzzyQuery.class));
|
||||||
|
FuzzyQuery fuzzyQuery = (FuzzyQuery) query;
|
||||||
|
assertEquals(expectedEdits, fuzzyQuery.getMaxEdits());
|
||||||
|
}
|
||||||
|
|
||||||
public void testFuzzyNumeric() throws Exception {
|
public void testFuzzyNumeric() throws Exception {
|
||||||
assumeTrue("test runs only when at least a type is registered", getCurrentTypes().length > 0);
|
assumeTrue("test runs only when at least a type is registered", getCurrentTypes().length > 0);
|
||||||
QueryStringQueryBuilder query = queryStringQuery("12~0.2").defaultField(INT_FIELD_NAME);
|
QueryStringQueryBuilder query = queryStringQuery("12~0.2").defaultField(INT_FIELD_NAME);
|
||||||
|
|
Loading…
Reference in New Issue