Skip to content

Commit 5cdea6e

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 19f6a35 commit 5cdea6e

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
@@ -169,4 +169,28 @@ private static Fuzziness doSerializeRoundtrip(Fuzziness in) throws IOException {
169169
StreamInput streamInput = output.bytes().streamInput();
170170
return new Fuzziness(streamInput);
171171
}
172+
173+
public void testAsDistanceString() {
174+
Fuzziness fuzziness = Fuzziness.build("0");
175+
assertEquals(0, fuzziness.asDistance(randomAlphaOfLengthBetween(0, 10)));
176+
fuzziness = Fuzziness.build("1");
177+
assertEquals(1, fuzziness.asDistance(randomAlphaOfLengthBetween(0, 10)));
178+
fuzziness = Fuzziness.build("2");
179+
assertEquals(2, fuzziness.asDistance(randomAlphaOfLengthBetween(0, 10)));
180+
181+
fuzziness = Fuzziness.build("AUTO");
182+
assertEquals(0, fuzziness.asDistance(""));
183+
assertEquals(0, fuzziness.asDistance("ab"));
184+
assertEquals(1, fuzziness.asDistance("abc"));
185+
assertEquals(1, fuzziness.asDistance("abcde"));
186+
assertEquals(2, fuzziness.asDistance("abcdef"));
187+
188+
fuzziness = Fuzziness.build("AUTO:5,7");
189+
assertEquals(0, fuzziness.asDistance(""));
190+
assertEquals(0, fuzziness.asDistance("abcd"));
191+
assertEquals(1, fuzziness.asDistance("abcde"));
192+
assertEquals(1, fuzziness.asDistance("abcdef"));
193+
assertEquals(2, fuzziness.asDistance("abcdefg"));
194+
195+
}
172196
}

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

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

667+
public void testMatchQueryFuzzy() throws Exception {
668+
assertAcked(prepareCreate("test").addMapping("_doc", "text", "type=text"));
669+
670+
indexRandom(true, client().prepareIndex("test", "_doc", "1").setSource("text", "Unit"),
671+
client().prepareIndex("test", "_doc", "2").setSource("text", "Unity"));
672+
673+
SearchResponse searchResponse = client().prepareSearch().setQuery(matchQuery("text", "uniy").fuzziness("0")).get();
674+
assertHitCount(searchResponse, 0L);
675+
676+
searchResponse = client().prepareSearch().setQuery(matchQuery("text", "uniy").fuzziness("1")).get();
677+
assertHitCount(searchResponse, 2L);
678+
assertSearchHits(searchResponse, "1", "2");
679+
680+
searchResponse = client().prepareSearch().setQuery(matchQuery("text", "uniy").fuzziness("AUTO")).get();
681+
assertHitCount(searchResponse, 2L);
682+
assertSearchHits(searchResponse, "1", "2");
683+
684+
searchResponse = client().prepareSearch().setQuery(matchQuery("text", "uniy").fuzziness("AUTO:5,7")).get();
685+
assertHitCount(searchResponse, 0L);
686+
687+
searchResponse = client().prepareSearch().setQuery(matchQuery("text", "unify").fuzziness("AUTO:5,7")).get();
688+
assertHitCount(searchResponse, 1L);
689+
assertSearchHits(searchResponse, "2");
690+
}
691+
692+
667693
public void testMultiMatchQuery() throws Exception {
668694
createIndex("test");
669695

0 commit comments

Comments
 (0)