diff --git a/core/src/main/java/org/elasticsearch/index/mapper/ScaledFloatFieldMapper.java b/core/src/main/java/org/elasticsearch/index/mapper/ScaledFloatFieldMapper.java index 7059345174959..3cc02584b12fe 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/ScaledFloatFieldMapper.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/ScaledFloatFieldMapper.java @@ -399,8 +399,12 @@ protected void parseCreateField(ParseContext context, List field double doubleValue = numericValue.doubleValue(); if (Double.isFinite(doubleValue) == false) { - // since we encode to a long, we have no way to carry NaNs and infinities - throw new IllegalArgumentException("[scaled_float] only supports finite values, but got [" + doubleValue + "]"); + if (ignoreMalformed.value()) { + return; + } else { + // since we encode to a long, we have no way to carry NaNs and infinities + throw new IllegalArgumentException("[scaled_float] only supports finite values, but got [" + doubleValue + "]"); + } } long scaledValue = Math.round(doubleValue * fieldType().getScalingFactor()); diff --git a/core/src/test/java/org/elasticsearch/index/mapper/ScaledFloatFieldMapperTests.java b/core/src/test/java/org/elasticsearch/index/mapper/ScaledFloatFieldMapperTests.java index c2d0317ea070f..c0650c9c72e5b 100644 --- a/core/src/test/java/org/elasticsearch/index/mapper/ScaledFloatFieldMapperTests.java +++ b/core/src/test/java/org/elasticsearch/index/mapper/ScaledFloatFieldMapperTests.java @@ -31,7 +31,9 @@ import org.junit.Before; import java.io.IOException; +import java.util.Arrays; import java.util.Collection; +import java.util.List; import static org.hamcrest.Matchers.containsString; @@ -223,10 +225,19 @@ public void testCoerce() throws Exception { } public void testIgnoreMalformed() throws Exception { + doTestIgnoreMalformed("a", "For input string: \"a\""); + + List values = Arrays.asList("NaN", "Infinity", "-Infinity"); + for (String value : values) { + doTestIgnoreMalformed(value, "[scaled_float] only supports finite values, but got [" + value + "]"); + } + } + + private void doTestIgnoreMalformed(String value, String exceptionMessageContains) throws Exception { String mapping = XContentFactory.jsonBuilder().startObject().startObject("type") - .startObject("properties").startObject("field").field("type", "scaled_float") - .field("scaling_factor", 10.0).endObject().endObject() - .endObject().endObject().string(); + .startObject("properties").startObject("field").field("type", "scaled_float") + .field("scaling_factor", 10.0).endObject().endObject() + .endObject().endObject().string(); DocumentMapper mapper = parser.parse("type", new CompressedXContent(mapping)); @@ -234,26 +245,26 @@ public void testIgnoreMalformed() throws Exception { ThrowingRunnable runnable = () -> mapper.parse(SourceToParse.source("test", "type", "1", XContentFactory.jsonBuilder() .startObject() - .field("field", "a") + .field("field", value) .endObject() .bytes(), - XContentType.JSON)); + XContentType.JSON)); MapperParsingException e = expectThrows(MapperParsingException.class, runnable); - assertThat(e.getCause().getMessage(), containsString("For input string: \"a\"")); + assertThat(e.getCause().getMessage(), containsString(exceptionMessageContains)); mapping = XContentFactory.jsonBuilder().startObject().startObject("type") - .startObject("properties").startObject("field").field("type", "scaled_float") - .field("scaling_factor", 10.0).field("ignore_malformed", true).endObject().endObject() - .endObject().endObject().string(); + .startObject("properties").startObject("field").field("type", "scaled_float") + .field("scaling_factor", 10.0).field("ignore_malformed", true).endObject().endObject() + .endObject().endObject().string(); DocumentMapper mapper2 = parser.parse("type", new CompressedXContent(mapping)); ParsedDocument doc = mapper2.parse(SourceToParse.source("test", "type", "1", XContentFactory.jsonBuilder() .startObject() - .field("field", "a") + .field("field", value) .endObject() .bytes(), - XContentType.JSON)); + XContentType.JSON)); IndexableField[] fields = doc.rootDoc().getFields("field"); assertEquals(0, fields.length);