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* +
|
*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.
|
||||||
|
====
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue