Emit deprecation warnings when boosts are defined in mappings (#62623)

We removed index-time boosting back in 5x, and we no longer document the 'boost'
parameter on any of our mapping types. However, it is still possible to define an
index-time boost on a field mapper for a surprisingly large number of field types, and
they even have an effect (sometimes, on some queries).

As a first step in finally removing all traces of index time boosting, this comment emits
a deprecation warning whenever a boost parameter is found on a mapping definition.
This commit is contained in:
Alan Woodward 2020-09-18 15:34:54 +01:00 committed by Alan Woodward
parent e163559e4c
commit 43ace5f80d
9 changed files with 70 additions and 2 deletions

View File

@ -54,3 +54,18 @@ deprecated starting 7.10.0 and will be removed in 8.0.0.
*Impact* + *Impact* +
Use the <<repositories-metering-apis,Repositories Metering APIs>>. Use the <<repositories-metering-apis,Repositories Metering APIs>>.
==== ====
[[mapping-boosts]]
.The `boost` parameter on field mappings has been deprecated
[%collapsible]
====
*Details* +
Index-time boosts have been deprecated since the 5x line, but it is still possible
to declare field-specific boosts in the mappings. This is now deprecated as well,
and will be removed entirely in 8.0. Mappings containing field boosts will continue
to work in 7.x but will emit a deprecation warning.
*Impact* +
The `boost` setting should be removed from templates and mappings. Use boosts
directly on queries instead.
====

View File

@ -571,6 +571,12 @@ public abstract class ParametrizedFieldMapper extends FieldMapper {
throw new MapperParsingException("unknown parameter [" + propName throw new MapperParsingException("unknown parameter [" + propName
+ "] on mapper [" + name + "] of type [" + type + "]"); + "] on mapper [" + name + "] of type [" + type + "]");
} }
if (Objects.equals("boost", propName)) {
deprecationLogger.deprecate(
"boost",
"Parameter [boost] on field [{}] is deprecated and will be removed in 8.0",
name);
}
if (propNode == null && parameter.acceptsNull == false) { if (propNode == null && parameter.acceptsNull == false) {
throw new MapperParsingException("[" + propName + "] on mapper [" + name throw new MapperParsingException("[" + propName + "] on mapper [" + name
+ "] of type [" + type + "] must not have a [null] value"); + "] of type [" + type + "] must not have a [null] value");

View File

@ -245,6 +245,10 @@ public class TypeParsers {
iterator.remove(); iterator.remove();
} else if (propName.equals("boost")) { } else if (propName.equals("boost")) {
builder.boost(nodeFloatValue(propNode)); builder.boost(nodeFloatValue(propNode));
deprecationLogger.deprecate(
"boost",
"Parameter [boost] on field [{}] is deprecated and will be removed in 8.0",
name);
iterator.remove(); iterator.remove();
} else if (propName.equals("index_options")) { } else if (propName.equals("index_options")) {
builder.indexOptions(nodeIndexOptionValue(propNode)); builder.indexOptions(nodeIndexOptionValue(propNode));

View File

@ -48,6 +48,11 @@ public class BooleanFieldMapperTests extends MapperTestCase {
b.field("type", "boolean"); b.field("type", "boolean");
} }
@Override
protected void assertParseMaximalWarnings() {
assertWarnings("Parameter [boost] on field [field] is deprecated and will be removed in 8.0");
}
public void testDefaults() throws IOException { public void testDefaults() throws IOException {
MapperService mapperService = createMapperService(fieldMapping(this::minimalMapping)); MapperService mapperService = createMapperService(fieldMapping(this::minimalMapping));
@ -170,6 +175,7 @@ public class BooleanFieldMapperTests extends MapperTestCase {
MappedFieldType ft = mapperService.fieldType("field"); MappedFieldType ft = mapperService.fieldType("field");
assertEquals(new BoostQuery(new TermQuery(new Term("field", "T")), 2.0f), ft.termQuery("true", null)); assertEquals(new BoostQuery(new TermQuery(new Term("field", "T")), 2.0f), ft.termQuery("true", null));
assertParseMaximalWarnings();
} }
public void testFetchSourceValue() throws IOException { public void testFetchSourceValue() throws IOException {

View File

@ -49,6 +49,11 @@ public class DateFieldMapperTests extends MapperTestCase {
b.field("type", "date"); b.field("type", "date");
} }
@Override
protected void assertParseMaximalWarnings() {
assertWarnings("Parameter [boost] on field [field] is deprecated and will be removed in 8.0");
}
public void testDefaults() throws Exception { public void testDefaults() throws Exception {
DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping)); DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping));

View File

@ -131,6 +131,11 @@ public class KeywordFieldMapperTests extends MapperTestCase {
b.field("type", "keyword"); b.field("type", "keyword");
} }
@Override
protected void assertParseMaximalWarnings() {
assertWarnings("Parameter [boost] on field [field] is deprecated and will be removed in 8.0");
}
public void testDefaults() throws Exception { public void testDefaults() throws Exception {
XContentBuilder mapping = fieldMapping(this::minimalMapping); XContentBuilder mapping = fieldMapping(this::minimalMapping);
DocumentMapper mapper = createDocumentMapper(mapping); DocumentMapper mapper = createDocumentMapper(mapping);
@ -235,6 +240,7 @@ public class KeywordFieldMapperTests extends MapperTestCase {
public void testBoost() throws IOException { public void testBoost() throws IOException {
MapperService mapperService = createMapperService(fieldMapping(b -> b.field("type", "keyword").field("boost", 2f))); MapperService mapperService = createMapperService(fieldMapping(b -> b.field("type", "keyword").field("boost", 2f)));
assertThat(mapperService.fieldType("field").boost(), equalTo(2f)); assertThat(mapperService.fieldType("field").boost(), equalTo(2f));
assertWarnings("Parameter [boost] on field [field] is deprecated and will be removed in 8.0");
} }
public void testEnableNorms() throws IOException { public void testEnableNorms() throws IOException {

View File

@ -80,6 +80,11 @@ public class RangeFieldMapperTests extends AbstractNumericFieldMapperTestCase {
b.field("type", "long_range"); b.field("type", "long_range");
} }
@Override
protected void assertParseMaximalWarnings() {
assertWarnings("Parameter [boost] on field [field] is deprecated and will be removed in 8.0");
}
private Object getFrom(String type) { private Object getFrom(String type) {
if (type.equals("date_range")) { if (type.equals("date_range")) {
return FROM_DATE; return FROM_DATE;

View File

@ -364,7 +364,7 @@ public class MatchQueryBuilderTests extends AbstractQueryTestCase<MatchQueryBuil
protected void initializeAdditionalMappings(MapperService mapperService) throws IOException { protected void initializeAdditionalMappings(MapperService mapperService) throws IOException {
mapperService.merge("_doc", new CompressedXContent(Strings.toString(PutMappingRequest.buildFromSimplifiedDef( mapperService.merge("_doc", new CompressedXContent(Strings.toString(PutMappingRequest.buildFromSimplifiedDef(
"_doc", "_doc",
"string_boost", "type=text,boost=4", "string_no_pos", "string_boost", "type=text", "string_no_pos",
"type=text,index_options=docs")) "type=text,index_options=docs"))
), ),
MapperService.MergeReason.MAPPING_UPDATE); MapperService.MergeReason.MAPPING_UPDATE);

View File

@ -41,6 +41,7 @@ import java.util.List;
import java.util.function.BiFunction; import java.util.function.BiFunction;
import java.util.function.Supplier; import java.util.function.Supplier;
import static org.hamcrest.Matchers.anyOf;
import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.containsString;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@ -81,13 +82,17 @@ public abstract class MapperTestCase extends MapperServiceTestCase {
createMapperService(orig).documentMapper().mapping().toXContent(parsedFromOrig, INCLUDE_DEFAULTS); createMapperService(orig).documentMapper().mapping().toXContent(parsedFromOrig, INCLUDE_DEFAULTS);
parsedFromOrig.endObject(); parsedFromOrig.endObject();
assertEquals(Strings.toString(orig), Strings.toString(parsedFromOrig)); assertEquals(Strings.toString(orig), Strings.toString(parsedFromOrig));
assertParseMinimalWarnings(); assertParseMaximalWarnings();
} }
protected void assertParseMinimalWarnings() { protected void assertParseMinimalWarnings() {
// Most mappers don't emit any warnings // Most mappers don't emit any warnings
} }
protected void assertParseMaximalWarnings() {
// Most mappers don't emit any warnings
}
/** /**
* Override to disable testing {@code meta} in fields that don't support it. * Override to disable testing {@code meta} in fields that don't support it.
*/ */
@ -131,6 +136,22 @@ public abstract class MapperTestCase extends MapperServiceTestCase {
); );
} }
public final void testDeprecatedBoost() throws IOException {
try {
createMapperService(fieldMapping(b -> {
minimalMapping(b);
b.field("boost", 2.0);
}));
assertWarnings("Parameter [boost] on field [field] is deprecated and will be removed in 8.0");
}
catch (MapperParsingException e) {
assertThat(e.getMessage(), anyOf(
containsString("unknown parameter [boost]"),
containsString("[boost : 2.0]")));
}
assertParseMinimalWarnings();
}
public static List<?> fetchSourceValue(FieldMapper mapper, Object sourceValue) throws IOException { public static List<?> fetchSourceValue(FieldMapper mapper, Object sourceValue) throws IOException {
return fetchSourceValue(mapper, sourceValue, null); return fetchSourceValue(mapper, sourceValue, null);
} }