diff --git a/core/src/main/java/org/elasticsearch/search/suggest/phrase/DirectCandidateGeneratorBuilder.java b/core/src/main/java/org/elasticsearch/search/suggest/phrase/DirectCandidateGeneratorBuilder.java index 52d1126e43490..b5d4ff716e5c3 100644 --- a/core/src/main/java/org/elasticsearch/search/suggest/phrase/DirectCandidateGeneratorBuilder.java +++ b/core/src/main/java/org/elasticsearch/search/suggest/phrase/DirectCandidateGeneratorBuilder.java @@ -31,6 +31,8 @@ import org.elasticsearch.common.ParseField; import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamOutput; +import org.elasticsearch.common.logging.DeprecationLogger; +import org.elasticsearch.common.logging.Loggers; import org.elasticsearch.common.xcontent.ConstructingObjectParser; import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentFactory; @@ -45,6 +47,9 @@ public final class DirectCandidateGeneratorBuilder implements CandidateGenerator { + private static final DeprecationLogger DEPRECATION_LOGGER = new DeprecationLogger( + Loggers.getLogger(DirectCandidateGeneratorBuilder.class)); + private static final String TYPE = "direct_generator"; public static final ParseField DIRECT_GENERATOR_FIELD = new ParseField(TYPE); @@ -211,8 +216,8 @@ String sort() { * string distance for terms inside the index. *
damerau_levenshtein - String distance algorithm
* based on Damerau-Levenshtein algorithm.
- * levenstein - String distance algorithm based on
- * Levenstein edit distance algorithm.
+ * levenshtein - String distance algorithm based on
+ * Levenshtein edit distance algorithm.
* jarowinkler - String distance algorithm based on
* Jaro-Winkler algorithm.
* ngram - String distance algorithm based on character
@@ -458,13 +463,16 @@ private static SuggestMode resolveSuggestMode(String suggestMode) {
}
}
- private static StringDistance resolveDistance(String distanceVal) {
+ static StringDistance resolveDistance(String distanceVal) {
distanceVal = distanceVal.toLowerCase(Locale.US);
if ("internal".equals(distanceVal)) {
return DirectSpellChecker.INTERNAL_LEVENSHTEIN;
} else if ("damerau_levenshtein".equals(distanceVal) || "damerauLevenshtein".equals(distanceVal)) {
return new LuceneLevenshteinDistance();
} else if ("levenstein".equals(distanceVal)) {
+ DEPRECATION_LOGGER.deprecated("Deprecated distance [levenstein] used, replaced by [levenshtein]");
+ return new LevensteinDistance();
+ } else if ("levenshtein".equals(distanceVal)) {
return new LevensteinDistance();
// TODO Jaro and Winkler are 2 people - so apply same naming logic
// as damerau_levenshtein
diff --git a/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestionBuilder.java b/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestionBuilder.java
index f701ff3642624..e8c8d6c3ae195 100644
--- a/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestionBuilder.java
+++ b/core/src/main/java/org/elasticsearch/search/suggest/term/TermSuggestionBuilder.java
@@ -30,6 +30,8 @@
import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.io.stream.Writeable;
+import org.elasticsearch.common.logging.DeprecationLogger;
+import org.elasticsearch.common.logging.Loggers;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentParser;
import org.elasticsearch.index.query.QueryShardContext;
@@ -66,6 +68,9 @@
* global options, but are only applicable for this suggestion.
*/
public class TermSuggestionBuilder extends SuggestionBuilderdamerau_levenshtein - String distance algorithm based on
* Damerau-Levenshtein algorithm.
- * levenstein - String distance algorithm based on
- * Levenstein edit distance algorithm.
+ * levenshtein - String distance algorithm based on
+ * Levenshtein edit distance algorithm.
* jarowinkler - String distance algorithm based on
* Jaro-Winkler algorithm.
* ngram - String distance algorithm based on character
@@ -543,8 +548,8 @@ public StringDistance toLucene() {
return new LuceneLevenshteinDistance();
}
},
- /** String distance algorithm based on Levenstein edit distance algorithm. */
- LEVENSTEIN {
+ /** String distance algorithm based on Levenshtein edit distance algorithm. */
+ LEVENSHTEIN {
@Override
public StringDistance toLucene() {
return new LevensteinDistance();
@@ -584,7 +589,10 @@ public static StringDistanceImpl resolve(final String str) {
case "damerauLevenshtein":
return DAMERAU_LEVENSHTEIN;
case "levenstein":
- return LEVENSTEIN;
+ DEPRECATION_LOGGER.deprecated("Deprecated distance [levenstein] used, replaced by [levenshtein]");
+ return LEVENSHTEIN;
+ case "levenshtein":
+ return LEVENSHTEIN;
case "ngram":
return NGRAM;
case "jarowinkler":
diff --git a/core/src/test/java/org/elasticsearch/search/suggest/phrase/DirectCandidateGeneratorTests.java b/core/src/test/java/org/elasticsearch/search/suggest/phrase/DirectCandidateGeneratorTests.java
index c92fba09d8cb4..25736c8fec9fd 100644
--- a/core/src/test/java/org/elasticsearch/search/suggest/phrase/DirectCandidateGeneratorTests.java
+++ b/core/src/test/java/org/elasticsearch/search/suggest/phrase/DirectCandidateGeneratorTests.java
@@ -19,6 +19,11 @@
package org.elasticsearch.search.suggest.phrase;
+import org.apache.lucene.search.spell.DirectSpellChecker;
+import org.apache.lucene.search.spell.JaroWinklerDistance;
+import org.apache.lucene.search.spell.LevensteinDistance;
+import org.apache.lucene.search.spell.LuceneLevenshteinDistance;
+import org.apache.lucene.search.spell.NGramDistance;
import org.elasticsearch.common.ParsingException;
import org.elasticsearch.common.io.stream.NamedWriteableRegistry;
import org.elasticsearch.common.xcontent.ToXContent;
@@ -38,6 +43,8 @@
import java.util.function.Supplier;
import static org.elasticsearch.test.EqualsHashCodeTestUtils.checkEqualsAndHashCode;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.core.IsInstanceOf.instanceOf;
public class DirectCandidateGeneratorTests extends ESTestCase {
private static final int NUMBER_OF_RUNS = 20;
@@ -65,6 +72,22 @@ public void testEqualsAndHashcode() throws IOException {
}
}
+ public void testFromString() {
+ assertThat(DirectCandidateGeneratorBuilder.resolveDistance("internal"), equalTo(DirectSpellChecker.INTERNAL_LEVENSHTEIN));
+ assertThat(DirectCandidateGeneratorBuilder.resolveDistance("damerau_levenshtein"), instanceOf(LuceneLevenshteinDistance.class));
+ assertThat(DirectCandidateGeneratorBuilder.resolveDistance("levenshtein"), instanceOf(LevensteinDistance.class));
+ assertThat(DirectCandidateGeneratorBuilder.resolveDistance("jaroWinkler"), instanceOf(JaroWinklerDistance.class));
+ assertThat(DirectCandidateGeneratorBuilder.resolveDistance("ngram"), instanceOf(NGramDistance.class));
+
+ expectThrows(IllegalArgumentException.class, () -> DirectCandidateGeneratorBuilder.resolveDistance("doesnt_exist"));
+ expectThrows(NullPointerException.class, () -> DirectCandidateGeneratorBuilder.resolveDistance(null));
+ }
+
+ public void testLevensteinDeprecation() {
+ assertThat(DirectCandidateGeneratorBuilder.resolveDistance("levenstein"), instanceOf(LevensteinDistance.class));
+ assertWarnings("Deprecated distance [levenstein] used, replaced by [levenshtein]");
+ }
+
private static DirectCandidateGeneratorBuilder mutate(DirectCandidateGeneratorBuilder original) throws IOException {
DirectCandidateGeneratorBuilder mutation = copy(original);
List