Un-deprecate fuzzy query (#22088)

When we decided to deprecate and remove fuzzy query in #15760, we didn't realize we would take away the possibililty for uses to use a fuzzy query as part of a span query, which is not possible using match query. This means we have to go back and un-deprecate fuzzy query, which will not be removed.

Closes #15760
This commit is contained in:
Luca Cavanna 2016-12-12 12:09:16 +01:00 committed by GitHub
parent b0ab3237d3
commit 73cf002293
7 changed files with 7 additions and 55 deletions

View File

@ -28,8 +28,6 @@ import org.elasticsearch.common.ParsingException;
import org.elasticsearch.common.Strings; import org.elasticsearch.common.Strings;
import org.elasticsearch.common.io.stream.StreamInput; import org.elasticsearch.common.io.stream.StreamInput;
import org.elasticsearch.common.io.stream.StreamOutput; import org.elasticsearch.common.io.stream.StreamOutput;
import org.elasticsearch.common.logging.DeprecationLogger;
import org.elasticsearch.common.logging.Loggers;
import org.elasticsearch.common.lucene.BytesRefs; import org.elasticsearch.common.lucene.BytesRefs;
import org.elasticsearch.common.unit.Fuzziness; import org.elasticsearch.common.unit.Fuzziness;
import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.common.xcontent.XContentBuilder;
@ -43,16 +41,10 @@ import java.util.Optional;
/** /**
* A Query that does fuzzy matching for a specific value. * A Query that does fuzzy matching for a specific value.
*
* @deprecated Fuzzy queries are not useful enough. This class will be removed with Elasticsearch 4.0. In most cases you may want to use
* a match query with the fuzziness parameter for strings or range queries for numeric and date fields.
*/ */
@Deprecated
public class FuzzyQueryBuilder extends AbstractQueryBuilder<FuzzyQueryBuilder> implements MultiTermQueryBuilder { public class FuzzyQueryBuilder extends AbstractQueryBuilder<FuzzyQueryBuilder> implements MultiTermQueryBuilder {
public static final String NAME = "fuzzy"; public static final String NAME = "fuzzy";
private static final DeprecationLogger DEPRECATION_LOGGER = new DeprecationLogger(Loggers.getLogger(FuzzyQueryBuilder.class));
/** Default maximum edit distance. Defaults to AUTO. */ /** Default maximum edit distance. Defaults to AUTO. */
public static final Fuzziness DEFAULT_FUZZINESS = Fuzziness.AUTO; public static final Fuzziness DEFAULT_FUZZINESS = Fuzziness.AUTO;
@ -155,7 +147,6 @@ public class FuzzyQueryBuilder extends AbstractQueryBuilder<FuzzyQueryBuilder> i
* @param value The value of the term * @param value The value of the term
*/ */
public FuzzyQueryBuilder(String fieldName, Object value) { public FuzzyQueryBuilder(String fieldName, Object value) {
DEPRECATION_LOGGER.deprecated("{} query is deprecated. Instead use the [match] query with fuzziness parameter", NAME);
if (Strings.isEmpty(fieldName)) { if (Strings.isEmpty(fieldName)) {
throw new IllegalArgumentException("field name cannot be null or empty"); throw new IllegalArgumentException("field name cannot be null or empty");
} }

View File

@ -197,13 +197,9 @@ public abstract class QueryBuilders {
* @param name The name of the field * @param name The name of the field
* @param value The value of the term * @param value The value of the term
* *
* @deprecated Fuzzy queries are not useful enough and will be removed with Elasticsearch 4.0. In most cases you may want to use
* a match query with the fuzziness parameter for strings or range queries for numeric and date fields.
*
* @see #matchQuery(String, Object) * @see #matchQuery(String, Object)
* @see #rangeQuery(String) * @see #rangeQuery(String)
*/ */
@Deprecated
public static FuzzyQueryBuilder fuzzyQuery(String name, String value) { public static FuzzyQueryBuilder fuzzyQuery(String name, String value) {
return new FuzzyQueryBuilder(name, value); return new FuzzyQueryBuilder(name, value);
} }
@ -214,13 +210,9 @@ public abstract class QueryBuilders {
* @param name The name of the field * @param name The name of the field
* @param value The value of the term * @param value The value of the term
* *
* @deprecated Fuzzy queries are not useful enough and will be removed with Elasticsearch 4.0. In most cases you may want to use
* a match query with the fuzziness parameter for strings or range queries for numeric and date fields.
*
* @see #matchQuery(String, Object) * @see #matchQuery(String, Object)
* @see #rangeQuery(String) * @see #rangeQuery(String)
*/ */
@Deprecated
public static FuzzyQueryBuilder fuzzyQuery(String name, Object value) { public static FuzzyQueryBuilder fuzzyQuery(String name, Object value) {
return new FuzzyQueryBuilder(name, value); return new FuzzyQueryBuilder(name, value);
} }

View File

@ -27,8 +27,6 @@ import org.elasticsearch.common.ParsingException;
import org.elasticsearch.common.unit.Fuzziness; import org.elasticsearch.common.unit.Fuzziness;
import org.elasticsearch.search.internal.SearchContext; import org.elasticsearch.search.internal.SearchContext;
import org.elasticsearch.test.AbstractQueryTestCase; import org.elasticsearch.test.AbstractQueryTestCase;
import org.junit.After;
import org.junit.internal.AssumptionViolatedException;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
@ -40,20 +38,6 @@ import static org.hamcrest.Matchers.instanceOf;
public class FuzzyQueryBuilderTests extends AbstractQueryTestCase<FuzzyQueryBuilder> { public class FuzzyQueryBuilderTests extends AbstractQueryTestCase<FuzzyQueryBuilder> {
private boolean testSkipped = false;
/**
* All tests create deprecation warnings when an new FuzzyQueryBuilder is created. Instead of having to check them once
* in every single test, this is done here after each test is run
*/
@After
void checkWarningHeaders() throws IOException {
// only check that warning headers got created for tests that satisfied certain assumptions and were thus not skipped
if (testSkipped == false) {
checkWarningHeaders("fuzzy query is deprecated. Instead use the [match] query with fuzziness parameter");
}
}
@Override @Override
protected FuzzyQueryBuilder doCreateTestQueryBuilder() { protected FuzzyQueryBuilder doCreateTestQueryBuilder() {
FuzzyQueryBuilder query = new FuzzyQueryBuilder(STRING_FIELD_NAME, getRandomValueForFieldName(STRING_FIELD_NAME)); FuzzyQueryBuilder query = new FuzzyQueryBuilder(STRING_FIELD_NAME, getRandomValueForFieldName(STRING_FIELD_NAME));
@ -114,13 +98,7 @@ public class FuzzyQueryBuilderTests extends AbstractQueryTestCase<FuzzyQueryBuil
} }
public void testToQueryWithStringField() throws IOException { public void testToQueryWithStringField() throws IOException {
try { assumeTrue("test runs only when at least a type is registered", getCurrentTypes().length > 0);
assumeTrue("test runs only when at least a type is registered", getCurrentTypes().length > 0);
} catch (AssumptionViolatedException e) {
// we need to know that this test was skipped in @After checkWarningHeaders(), because no warnings will be generated
testSkipped = true;
throw e;
}
String query = "{\n" + String query = "{\n" +
" \"fuzzy\":{\n" + " \"fuzzy\":{\n" +
" \"" + STRING_FIELD_NAME + "\":{\n" + " \"" + STRING_FIELD_NAME + "\":{\n" +
@ -143,13 +121,7 @@ public class FuzzyQueryBuilderTests extends AbstractQueryTestCase<FuzzyQueryBuil
} }
public void testToQueryWithNumericField() throws IOException { public void testToQueryWithNumericField() throws IOException {
try { assumeTrue("test runs only when at least a type is registered", getCurrentTypes().length > 0);
assumeTrue("test runs only when at least a type is registered", getCurrentTypes().length > 0);
} catch (AssumptionViolatedException e) {
// we need to know that this test was skipped in @After checkWarningHeaders(), because no warnings will be generated
testSkipped = true;
throw e;
}
String query = "{\n" + String query = "{\n" +
" \"fuzzy\":{\n" + " \"fuzzy\":{\n" +
" \"" + INT_FIELD_NAME + "\":{\n" + " \"" + INT_FIELD_NAME + "\":{\n" +

View File

@ -62,7 +62,7 @@ public class RandomQueryBuilder {
// for now, only use String Rangequeries for MultiTerm test, numeric and date makes little sense // for now, only use String Rangequeries for MultiTerm test, numeric and date makes little sense
// see issue #12123 for discussion // see issue #12123 for discussion
MultiTermQueryBuilder multiTermQueryBuilder; MultiTermQueryBuilder multiTermQueryBuilder;
switch(RandomNumbers.randomIntBetween(r, 0, 2)) { switch(RandomNumbers.randomIntBetween(r, 0, 3)) {
case 0: case 0:
RangeQueryBuilder stringRangeQuery = new RangeQueryBuilder(AbstractQueryTestCase.STRING_FIELD_NAME); RangeQueryBuilder stringRangeQuery = new RangeQueryBuilder(AbstractQueryTestCase.STRING_FIELD_NAME);
stringRangeQuery.from("a" + RandomStrings.randomAsciiOfLengthBetween(r, 1, 10)); stringRangeQuery.from("a" + RandomStrings.randomAsciiOfLengthBetween(r, 1, 10));
@ -75,6 +75,10 @@ public class RandomQueryBuilder {
case 2: case 2:
multiTermQueryBuilder = new WildcardQueryBuilderTests().createTestQueryBuilder(); multiTermQueryBuilder = new WildcardQueryBuilderTests().createTestQueryBuilder();
break; break;
case 3:
multiTermQueryBuilder = new FuzzyQueryBuilder(AbstractQueryTestCase.STRING_FIELD_NAME,
RandomStrings.randomAsciiOfLengthBetween(r, 1, 10));
break;
default: default:
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }

View File

@ -195,7 +195,6 @@ public class RandomQueryGenerator {
return q; return q;
} }
@Deprecated
private static QueryBuilder randomFuzzyQuery(List<String> fields) { private static QueryBuilder randomFuzzyQuery(List<String> fields) {
QueryBuilder q = QueryBuilders.fuzzyQuery(randomField(fields), randomQueryString(1)); QueryBuilder q = QueryBuilders.fuzzyQuery(randomField(fields), randomQueryString(1));

View File

@ -1,8 +1,6 @@
[[java-query-dsl-fuzzy-query]] [[java-query-dsl-fuzzy-query]]
==== Fuzzy Query ==== Fuzzy Query
deprecated[3.0.0, Will be removed without a replacement for `string` fields. Note that the `fuzziness` parameter is still supported for match queries and in suggesters. Use range queries for `date` and `numeric` fields instead.]
See {ref}/query-dsl-fuzzy-query.html[Fuzzy Query] See {ref}/query-dsl-fuzzy-query.html[Fuzzy Query]
[source,java] [source,java]

View File

@ -1,8 +1,6 @@
[[query-dsl-fuzzy-query]] [[query-dsl-fuzzy-query]]
=== Fuzzy Query === Fuzzy Query
deprecated[5.0.0, Will be removed in 6.0. Use match queries with fuzziness instead]
The fuzzy query uses similarity based on Levenshtein edit distance. The fuzzy query uses similarity based on Levenshtein edit distance.
==== String fields ==== String fields
@ -24,7 +22,6 @@ GET /_search
} }
-------------------------------------------------- --------------------------------------------------
// CONSOLE // CONSOLE
// TEST[warning:fuzzy query is deprecated. Instead use the [match] query with fuzziness parameter]
Or with more advanced settings: Or with more advanced settings:
@ -46,7 +43,6 @@ GET /_search
} }
-------------------------------------------------- --------------------------------------------------
// CONSOLE // CONSOLE
// TEST[warning:fuzzy query is deprecated. Instead use the [match] query with fuzziness parameter]
[float] [float]
===== Parameters ===== Parameters