Skip to content

Commit d3f6dfa

Browse files
noChargerdblock
andauthored
Refactor fuzziness interface on query builders (opensearch-project#5433)
* Refactor Object to Fuzziness type for all query builders Signed-off-by: noCharger <lingzhichu.clz@gmail.com> * Revise on bwc Signed-off-by: noCharger <lingzhichu.clz@gmail.com> * Update change log Signed-off-by: noCharger <lingzhichu.clz@gmail.com> Signed-off-by: noCharger <lingzhichu.clz@gmail.com> Co-authored-by: Daniel (dB.) Doubrovkine <dblock@amazon.com>
1 parent 1710786 commit d3f6dfa

13 files changed

Lines changed: 90 additions & 26 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
101101
- Bump gradle-extra-configurations-plugin from 7.0.0 to 8.0.0 ([#4808](https://github.com/opensearch-project/OpenSearch/pull/4808))
102102
### Changed
103103
### Deprecated
104+
- Refactor fuzziness interface on query builders ([#5433](https://github.com/opensearch-project/OpenSearch/pull/5433))
105+
104106
### Removed
105107
### Fixed
106108
- Fix 1.x compatibility bug with stored Tasks ([#5412](https://github.com/opensearch-project/OpenSearch/pull/5412))

server/src/internalClusterTest/java/org/opensearch/search/query/MultiMatchQueryIT.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.opensearch.action.index.IndexRequestBuilder;
3838
import org.opensearch.action.search.SearchResponse;
3939
import org.opensearch.common.settings.Settings;
40+
import org.opensearch.common.unit.Fuzziness;
4041
import org.opensearch.common.util.set.Sets;
4142
import org.opensearch.common.xcontent.XContentBuilder;
4243
import org.opensearch.common.xcontent.XContentFactory;
@@ -1024,7 +1025,7 @@ public void testFuzzyFieldLevelBoosting() throws InterruptedException, Execution
10241025

10251026
SearchResponse searchResponse = client().prepareSearch(idx)
10261027
.setExplain(true)
1027-
.setQuery(multiMatchQuery("foo").field("title", 100).field("body").fuzziness(0))
1028+
.setQuery(multiMatchQuery("foo").field("title", 100).field("body").fuzziness(Fuzziness.ZERO))
10281029
.get();
10291030
SearchHit[] hits = searchResponse.getHits().getHits();
10301031
assertNotEquals("both documents should be on different shards", hits[0].getShard().getShardId(), hits[1].getShard().getShardId());

server/src/internalClusterTest/java/org/opensearch/search/query/SearchQueryIT.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import org.opensearch.common.regex.Regex;
5050
import org.opensearch.common.settings.Settings;
5151
import org.opensearch.common.time.DateFormatter;
52+
import org.opensearch.common.unit.Fuzziness;
5253
import org.opensearch.common.xcontent.XContentBuilder;
5354
import org.opensearch.common.xcontent.XContentFactory;
5455
import org.opensearch.common.xcontent.XContentType;
@@ -762,21 +763,21 @@ public void testMatchQueryFuzzy() throws Exception {
762763
client().prepareIndex("test").setId("2").setSource("text", "Unity")
763764
);
764765

765-
SearchResponse searchResponse = client().prepareSearch().setQuery(matchQuery("text", "uniy").fuzziness("0")).get();
766+
SearchResponse searchResponse = client().prepareSearch().setQuery(matchQuery("text", "uniy").fuzziness(Fuzziness.ZERO)).get();
766767
assertHitCount(searchResponse, 0L);
767768

768-
searchResponse = client().prepareSearch().setQuery(matchQuery("text", "uniy").fuzziness("1")).get();
769+
searchResponse = client().prepareSearch().setQuery(matchQuery("text", "uniy").fuzziness(Fuzziness.ONE)).get();
769770
assertHitCount(searchResponse, 2L);
770771
assertSearchHits(searchResponse, "1", "2");
771772

772-
searchResponse = client().prepareSearch().setQuery(matchQuery("text", "uniy").fuzziness("AUTO")).get();
773+
searchResponse = client().prepareSearch().setQuery(matchQuery("text", "uniy").fuzziness(Fuzziness.AUTO)).get();
773774
assertHitCount(searchResponse, 2L);
774775
assertSearchHits(searchResponse, "1", "2");
775776

776-
searchResponse = client().prepareSearch().setQuery(matchQuery("text", "uniy").fuzziness("AUTO:5,7")).get();
777+
searchResponse = client().prepareSearch().setQuery(matchQuery("text", "uniy").fuzziness(Fuzziness.customAuto(5, 7))).get();
777778
assertHitCount(searchResponse, 0L);
778779

779-
searchResponse = client().prepareSearch().setQuery(matchQuery("text", "unify").fuzziness("AUTO:5,7")).get();
780+
searchResponse = client().prepareSearch().setQuery(matchQuery("text", "unify").fuzziness(Fuzziness.customAuto(5, 7))).get();
780781
assertHitCount(searchResponse, 1L);
781782
assertSearchHits(searchResponse, "2");
782783
}

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,16 @@ public static Fuzziness build(Object fuzziness) {
139139
return new Fuzziness(string);
140140
}
141141

142+
/***
143+
* Creates a {@link Fuzziness} instance from lowDistance and highDistance.
144+
* where the edit distance is 0 for strings shorter than lowDistance,
145+
* 1 for strings where its length between lowDistance and highDistance (inclusive),
146+
* and 2 for strings longer than highDistance.
147+
*/
148+
public static Fuzziness customAuto(int lowDistance, int highDistance) {
149+
return new Fuzziness("AUTO", lowDistance, highDistance);
150+
}
151+
142152
private static Fuzziness parseCustomAuto(final String string) {
143153
assert string.toUpperCase(Locale.ROOT).startsWith(AUTO.asString() + ":");
144154
String[] fuzzinessLimit = string.substring(AUTO.asString().length() + 1).split(",");

server/src/main/java/org/opensearch/index/query/MatchBoolPrefixQueryBuilder.java

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -175,12 +175,19 @@ public String minimumShouldMatch() {
175175
return this.minimumShouldMatch;
176176
}
177177

178+
@Deprecated
178179
/** Sets the fuzziness used when evaluated to a fuzzy query type. Defaults to "AUTO". */
179180
public MatchBoolPrefixQueryBuilder fuzziness(Object fuzziness) {
180181
this.fuzziness = Fuzziness.build(fuzziness);
181182
return this;
182183
}
183184

185+
/** Sets the fuzziness used when evaluated to a fuzzy query type. Defaults to "AUTO". */
186+
public MatchBoolPrefixQueryBuilder fuzziness(Fuzziness fuzziness) {
187+
this.fuzziness = fuzziness;
188+
return this;
189+
}
190+
184191
/** Gets the fuzziness used when evaluated to a fuzzy query type. */
185192
public Fuzziness fuzziness() {
186193
return this.fuzziness;
@@ -348,19 +355,16 @@ public static MatchBoolPrefixQueryBuilder fromXContent(XContentParser parser) th
348355
}
349356
}
350357

351-
MatchBoolPrefixQueryBuilder queryBuilder = new MatchBoolPrefixQueryBuilder(fieldName, value);
352-
queryBuilder.analyzer(analyzer);
353-
queryBuilder.operator(operator);
354-
queryBuilder.minimumShouldMatch(minimumShouldMatch);
355-
queryBuilder.boost(boost);
356-
queryBuilder.queryName(queryName);
357-
if (fuzziness != null) {
358-
queryBuilder.fuzziness(fuzziness);
359-
}
360-
queryBuilder.prefixLength(prefixLength);
361-
queryBuilder.maxExpansions(maxExpansion);
362-
queryBuilder.fuzzyTranspositions(fuzzyTranspositions);
363-
queryBuilder.fuzzyRewrite(fuzzyRewrite);
358+
MatchBoolPrefixQueryBuilder queryBuilder = new MatchBoolPrefixQueryBuilder(fieldName, value).analyzer(analyzer)
359+
.operator(operator)
360+
.minimumShouldMatch(minimumShouldMatch)
361+
.boost(boost)
362+
.queryName(queryName)
363+
.fuzziness(fuzziness)
364+
.prefixLength(prefixLength)
365+
.maxExpansions(maxExpansion)
366+
.fuzzyTranspositions(fuzzyTranspositions)
367+
.fuzzyRewrite(fuzzyRewrite);
364368
return queryBuilder;
365369
}
366370

server/src/main/java/org/opensearch/index/query/MatchQueryBuilder.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -208,12 +208,19 @@ public String analyzer() {
208208
return this.analyzer;
209209
}
210210

211+
@Deprecated
211212
/** Sets the fuzziness used when evaluated to a fuzzy query type. Defaults to "AUTO". */
212213
public MatchQueryBuilder fuzziness(Object fuzziness) {
213214
this.fuzziness = Fuzziness.build(fuzziness);
214215
return this;
215216
}
216217

218+
/** Sets the fuzziness used when evaluated to a fuzzy query type. Defaults to "AUTO". */
219+
public MatchQueryBuilder fuzziness(Fuzziness fuzziness) {
220+
this.fuzziness = fuzziness;
221+
return this;
222+
}
223+
217224
/** Gets the fuzziness used when evaluated to a fuzzy query type. */
218225
public Fuzziness fuzziness() {
219226
return this.fuzziness;
@@ -565,9 +572,7 @@ public static MatchQueryBuilder fromXContent(XContentParser parser) throws IOExc
565572
matchQuery.operator(operator);
566573
matchQuery.analyzer(analyzer);
567574
matchQuery.minimumShouldMatch(minimumShouldMatch);
568-
if (fuzziness != null) {
569-
matchQuery.fuzziness(fuzziness);
570-
}
575+
matchQuery.fuzziness(fuzziness);
571576
matchQuery.fuzzyRewrite(fuzzyRewrite);
572577
matchQuery.prefixLength(prefixLength);
573578
matchQuery.fuzzyTranspositions(fuzzyTranspositions);

server/src/main/java/org/opensearch/index/query/MultiMatchQueryBuilder.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,7 @@ public int slop() {
397397
return slop;
398398
}
399399

400+
@Deprecated
400401
/**
401402
* Sets the fuzziness used when evaluated to a fuzzy query type. Defaults to "AUTO".
402403
*/
@@ -407,6 +408,14 @@ public MultiMatchQueryBuilder fuzziness(Object fuzziness) {
407408
return this;
408409
}
409410

411+
/**
412+
* Sets the fuzziness used when evaluated to a fuzzy query type. Defaults to "AUTO".
413+
*/
414+
public MultiMatchQueryBuilder fuzziness(Fuzziness fuzziness) {
415+
this.fuzziness = fuzziness;
416+
return this;
417+
}
418+
410419
public Fuzziness fuzziness() {
411420
return fuzziness;
412421
}

server/src/main/java/org/opensearch/index/query/QueryStringQueryBuilder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ public class QueryStringQueryBuilder extends AbstractQueryBuilder<QueryStringQue
7979
public static final int DEFAULT_FUZZY_PREFIX_LENGTH = FuzzyQuery.defaultPrefixLength;
8080
public static final int DEFAULT_FUZZY_MAX_EXPANSIONS = FuzzyQuery.defaultMaxExpansions;
8181
public static final int DEFAULT_PHRASE_SLOP = 0;
82+
/** Default maximum edit distance. Defaults to AUTO. */
8283
public static final Fuzziness DEFAULT_FUZZINESS = Fuzziness.AUTO;
8384
public static final Operator DEFAULT_OPERATOR = Operator.OR;
8485
public static final MultiMatchQueryBuilder.Type DEFAULT_TYPE = MultiMatchQueryBuilder.Type.BEST_FIELDS;
@@ -416,7 +417,7 @@ public boolean enablePositionIncrements() {
416417
* Set the edit distance for fuzzy queries. Default is "AUTO".
417418
*/
418419
public QueryStringQueryBuilder fuzziness(Fuzziness fuzziness) {
419-
this.fuzziness = fuzziness == null ? DEFAULT_FUZZINESS : fuzziness;
420+
this.fuzziness = fuzziness;
420421
return this;
421422
}
422423

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,12 @@ public void testSerializationCustomAuto() throws IOException {
174174
assertNotSame(original, deserializedFuzziness);
175175
assertEquals(original, deserializedFuzziness);
176176
assertEquals(original.asString(), deserializedFuzziness.asString());
177+
178+
original = Fuzziness.customAuto(4, 7);
179+
deserializedFuzziness = doSerializeRoundtrip(original);
180+
assertNotSame(original, deserializedFuzziness);
181+
assertEquals(original, deserializedFuzziness);
182+
assertEquals(original.asString(), deserializedFuzziness.asString());
177183
}
178184

179185
private static Fuzziness doSerializeRoundtrip(Fuzziness in) throws IOException {
@@ -205,5 +211,11 @@ public void testAsDistanceString() {
205211
assertEquals(1, fuzziness.asDistance("abcdef"));
206212
assertEquals(2, fuzziness.asDistance("abcdefg"));
207213

214+
fuzziness = Fuzziness.customAuto(5, 7);
215+
assertEquals(0, fuzziness.asDistance(""));
216+
assertEquals(0, fuzziness.asDistance("abcd"));
217+
assertEquals(1, fuzziness.asDistance("abcde"));
218+
assertEquals(1, fuzziness.asDistance("abcdef"));
219+
assertEquals(2, fuzziness.asDistance("abcdefg"));
208220
}
209221
}

server/src/test/java/org/opensearch/index/query/MatchBoolPrefixQueryBuilderTests.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,11 @@ public void testIllegalValues() {
179179
}
180180
}
181181

182+
public void testDefaultFuzziness() {
183+
MatchBoolPrefixQueryBuilder matchBoolPrefixQueryBuilder = new MatchBoolPrefixQueryBuilder(TEXT_FIELD_NAME, "text").fuzziness(null);
184+
assertNull(matchBoolPrefixQueryBuilder.fuzziness());
185+
}
186+
182187
public void testFromSimpleJson() throws IOException {
183188
final String simple = "{" + "\"match_bool_prefix\": {" + "\"fieldName\": \"fieldValue\"" + "}" + "}";
184189
final String expected = "{"

0 commit comments

Comments
 (0)