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());
|
||||
setPhraseSlop(settings.phraseSlop());
|
||||
setDefaultOperator(settings.defaultOperator());
|
||||
setFuzzyMinSim(settings.fuzziness().asFloat());
|
||||
setFuzzyPrefixLength(settings.fuzzyPrefixLength());
|
||||
setLocale(settings.locale());
|
||||
}
|
||||
|
@ -114,7 +113,7 @@ public class MapperQueryParser extends QueryParser {
|
|||
@Override
|
||||
Query handleBareFuzzy(String qfield, Token fuzzySlop, String termImage) throws ParseException {
|
||||
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));
|
||||
}
|
||||
|
|
|
@ -26,15 +26,16 @@ import org.apache.lucene.search.BooleanClause;
|
|||
import org.apache.lucene.search.BooleanQuery;
|
||||
import org.apache.lucene.search.BoostQuery;
|
||||
import org.apache.lucene.search.DisjunctionMaxQuery;
|
||||
import org.apache.lucene.search.FuzzyQuery;
|
||||
import org.apache.lucene.search.MatchAllDocsQuery;
|
||||
import org.apache.lucene.search.MatchNoDocsQuery;
|
||||
import org.apache.lucene.search.MultiTermQuery;
|
||||
import org.apache.lucene.search.PhraseQuery;
|
||||
import org.apache.lucene.search.PrefixQuery;
|
||||
import org.apache.lucene.search.Query;
|
||||
import org.apache.lucene.search.RegexpQuery;
|
||||
import org.apache.lucene.search.TermQuery;
|
||||
import org.apache.lucene.search.SynonymQuery;
|
||||
import org.apache.lucene.search.PrefixQuery;
|
||||
import org.apache.lucene.search.MultiTermQuery;
|
||||
import org.apache.lucene.search.TermQuery;
|
||||
import org.apache.lucene.util.automaton.TooComplexToDeterminizeException;
|
||||
import org.elasticsearch.common.lucene.all.AllTermQuery;
|
||||
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"));
|
||||
}
|
||||
|
||||
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 {
|
||||
assumeTrue("test runs only when at least a type is registered", getCurrentTypes().length > 0);
|
||||
QueryStringQueryBuilder query = queryStringQuery("12~0.2").defaultField(INT_FIELD_NAME);
|
||||
|
|
Loading…
Reference in New Issue