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:
parent
e163559e4c
commit
43ace5f80d
|
@ -54,3 +54,18 @@ deprecated starting 7.10.0 and will be removed in 8.0.0.
|
|||
*Impact* +
|
||||
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.
|
||||
====
|
||||
|
|
|
@ -571,6 +571,12 @@ public abstract class ParametrizedFieldMapper extends FieldMapper {
|
|||
throw new MapperParsingException("unknown parameter [" + propName
|
||||
+ "] 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) {
|
||||
throw new MapperParsingException("[" + propName + "] on mapper [" + name
|
||||
+ "] of type [" + type + "] must not have a [null] value");
|
||||
|
|
|
@ -245,6 +245,10 @@ public class TypeParsers {
|
|||
iterator.remove();
|
||||
} else if (propName.equals("boost")) {
|
||||
builder.boost(nodeFloatValue(propNode));
|
||||
deprecationLogger.deprecate(
|
||||
"boost",
|
||||
"Parameter [boost] on field [{}] is deprecated and will be removed in 8.0",
|
||||
name);
|
||||
iterator.remove();
|
||||
} else if (propName.equals("index_options")) {
|
||||
builder.indexOptions(nodeIndexOptionValue(propNode));
|
||||
|
|
|
@ -48,6 +48,11 @@ public class BooleanFieldMapperTests extends MapperTestCase {
|
|||
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 {
|
||||
|
||||
MapperService mapperService = createMapperService(fieldMapping(this::minimalMapping));
|
||||
|
@ -170,6 +175,7 @@ public class BooleanFieldMapperTests extends MapperTestCase {
|
|||
|
||||
MappedFieldType ft = mapperService.fieldType("field");
|
||||
assertEquals(new BoostQuery(new TermQuery(new Term("field", "T")), 2.0f), ft.termQuery("true", null));
|
||||
assertParseMaximalWarnings();
|
||||
}
|
||||
|
||||
public void testFetchSourceValue() throws IOException {
|
||||
|
|
|
@ -49,6 +49,11 @@ public class DateFieldMapperTests extends MapperTestCase {
|
|||
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 {
|
||||
|
||||
DocumentMapper mapper = createDocumentMapper(fieldMapping(this::minimalMapping));
|
||||
|
|
|
@ -131,6 +131,11 @@ public class KeywordFieldMapperTests extends MapperTestCase {
|
|||
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 {
|
||||
XContentBuilder mapping = fieldMapping(this::minimalMapping);
|
||||
DocumentMapper mapper = createDocumentMapper(mapping);
|
||||
|
@ -235,6 +240,7 @@ public class KeywordFieldMapperTests extends MapperTestCase {
|
|||
public void testBoost() throws IOException {
|
||||
MapperService mapperService = createMapperService(fieldMapping(b -> b.field("type", "keyword").field("boost", 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 {
|
||||
|
|
|
@ -80,6 +80,11 @@ public class RangeFieldMapperTests extends AbstractNumericFieldMapperTestCase {
|
|||
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) {
|
||||
if (type.equals("date_range")) {
|
||||
return FROM_DATE;
|
||||
|
|
|
@ -364,7 +364,7 @@ public class MatchQueryBuilderTests extends AbstractQueryTestCase<MatchQueryBuil
|
|||
protected void initializeAdditionalMappings(MapperService mapperService) throws IOException {
|
||||
mapperService.merge("_doc", new CompressedXContent(Strings.toString(PutMappingRequest.buildFromSimplifiedDef(
|
||||
"_doc",
|
||||
"string_boost", "type=text,boost=4", "string_no_pos",
|
||||
"string_boost", "type=text", "string_no_pos",
|
||||
"type=text,index_options=docs"))
|
||||
),
|
||||
MapperService.MergeReason.MAPPING_UPDATE);
|
||||
|
|
|
@ -41,6 +41,7 @@ import java.util.List;
|
|||
import java.util.function.BiFunction;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
import static org.hamcrest.Matchers.anyOf;
|
||||
import static org.hamcrest.Matchers.containsString;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
@ -81,13 +82,17 @@ public abstract class MapperTestCase extends MapperServiceTestCase {
|
|||
createMapperService(orig).documentMapper().mapping().toXContent(parsedFromOrig, INCLUDE_DEFAULTS);
|
||||
parsedFromOrig.endObject();
|
||||
assertEquals(Strings.toString(orig), Strings.toString(parsedFromOrig));
|
||||
assertParseMinimalWarnings();
|
||||
assertParseMaximalWarnings();
|
||||
}
|
||||
|
||||
protected void assertParseMinimalWarnings() {
|
||||
// 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.
|
||||
*/
|
||||
|
@ -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 {
|
||||
return fetchSourceValue(mapper, sourceValue, null);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue