Skip to content

Commit 49ff384

Browse files
author
Christoph Büscher
committed
Fix Fuzziness#asDistance(String) (#39643)
Currently Fuzziness#asDistance(String) doesn't work for custom AUTO values. If the fuzziness is AUTO, the method returns the correct edit distance to use, depending on the input string, but for custom AUTO values it currently always returns an edit distance of 1. Correcting this and adding unit and integration tests to catch these cases. Closes #39614
1 parent be10934 commit 49ff384

File tree

3 files changed

+51
-1
lines changed

3 files changed

+51
-1
lines changed

server/src/main/java/org/elasticsearch/common/unit/Fuzziness.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ public int asDistance() {
186186
}
187187

188188
public int asDistance(String text) {
189-
if (this.equals(AUTO)) { //AUTO
189+
if (this.equals(AUTO) || isAutoWithCustomValues()) { //AUTO
190190
final int len = termLen(text);
191191
if (len < lowDistance) {
192192
return 0;

server/src/test/java/org/elasticsearch/common/unit/FuzzinessTests.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,4 +167,28 @@ private static Fuzziness doSerializeRoundtrip(Fuzziness in) throws IOException {
167167
StreamInput streamInput = output.bytes().streamInput();
168168
return new Fuzziness(streamInput);
169169
}
170+
171+
public void testAsDistanceString() {
172+
Fuzziness fuzziness = Fuzziness.build("0");
173+
assertEquals(0, fuzziness.asDistance(randomAlphaOfLengthBetween(0, 10)));
174+
fuzziness = Fuzziness.build("1");
175+
assertEquals(1, fuzziness.asDistance(randomAlphaOfLengthBetween(0, 10)));
176+
fuzziness = Fuzziness.build("2");
177+
assertEquals(2, fuzziness.asDistance(randomAlphaOfLengthBetween(0, 10)));
178+
179+
fuzziness = Fuzziness.build("AUTO");
180+
assertEquals(0, fuzziness.asDistance(""));
181+
assertEquals(0, fuzziness.asDistance("ab"));
182+
assertEquals(1, fuzziness.asDistance("abc"));
183+
assertEquals(1, fuzziness.asDistance("abcde"));
184+
assertEquals(2, fuzziness.asDistance("abcdef"));
185+
186+
fuzziness = Fuzziness.build("AUTO:5,7");
187+
assertEquals(0, fuzziness.asDistance(""));
188+
assertEquals(0, fuzziness.asDistance("abcd"));
189+
assertEquals(1, fuzziness.asDistance("abcde"));
190+
assertEquals(1, fuzziness.asDistance("abcdef"));
191+
assertEquals(2, fuzziness.asDistance("abcdefg"));
192+
193+
}
170194
}

server/src/test/java/org/elasticsearch/search/query/SearchQueryIT.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -722,6 +722,32 @@ public void testMatchQueryNumeric() throws Exception {
722722
expectThrows(SearchPhaseExecutionException.class, () -> client().prepareSearch().setQuery(matchQuery("double", "2 3 4")).get());
723723
}
724724

725+
public void testMatchQueryFuzzy() throws Exception {
726+
assertAcked(prepareCreate("test").addMapping("_doc", "text", "type=text"));
727+
728+
indexRandom(true, client().prepareIndex("test", "_doc", "1").setSource("text", "Unit"),
729+
client().prepareIndex("test", "_doc", "2").setSource("text", "Unity"));
730+
731+
SearchResponse searchResponse = client().prepareSearch().setQuery(matchQuery("text", "uniy").fuzziness("0")).get();
732+
assertHitCount(searchResponse, 0L);
733+
734+
searchResponse = client().prepareSearch().setQuery(matchQuery("text", "uniy").fuzziness("1")).get();
735+
assertHitCount(searchResponse, 2L);
736+
assertSearchHits(searchResponse, "1", "2");
737+
738+
searchResponse = client().prepareSearch().setQuery(matchQuery("text", "uniy").fuzziness("AUTO")).get();
739+
assertHitCount(searchResponse, 2L);
740+
assertSearchHits(searchResponse, "1", "2");
741+
742+
searchResponse = client().prepareSearch().setQuery(matchQuery("text", "uniy").fuzziness("AUTO:5,7")).get();
743+
assertHitCount(searchResponse, 0L);
744+
745+
searchResponse = client().prepareSearch().setQuery(matchQuery("text", "unify").fuzziness("AUTO:5,7")).get();
746+
assertHitCount(searchResponse, 1L);
747+
assertSearchHits(searchResponse, "2");
748+
}
749+
750+
725751
public void testMultiMatchQuery() throws Exception {
726752
createIndex("test");
727753

0 commit comments

Comments
 (0)