Skip to content

Commit edcdc43

Browse files
devnamritselasticmachineamyjtechwriter
authored
enhancement: boolean field to support ignore_malformed (#90122)
* enhancement: boolean field to support ignore_malformed * fix: changes in current builder for BooleanFieldMappers within tests files. * Updating documentation Co-authored-by: Elastic Machine <[email protected]> Co-authored-by: Amy Jonsson <[email protected]>
1 parent 6071c76 commit edcdc43

File tree

7 files changed

+42
-11
lines changed

7 files changed

+42
-11
lines changed

docs/reference/mapping/params/ignore-malformed.asciidoc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ PUT my-index-000001/_doc/2
4949
The `ignore_malformed` setting is currently supported by the following <<mapping-types,mapping types>>:
5050

5151
<<number>>:: `long`, `integer`, `short`, `byte`, `double`, `float`, `half_float`, `scaled_float`
52+
<<boolean>>:: `true`, `false`
5253
<<date>>:: `date`
5354
<<date_nanos>>:: `date_nanos`
5455
<<geo-point>>:: `geo_point` for lat/lon points

docs/reference/mapping/types/boolean.asciidoc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,10 @@ The following parameters are accepted by `boolean` fields:
179179
enabled can still be queried using term or range-based queries,
180180
albeit slower.
181181

182+
<<ignore-malformed, `ignore_malformed`>>::
183+
184+
Trying to index the wrong data type into a field throws an exception by default, and rejects the whole document. If this parameter is set to true, it allows the exception to be ignored. The malformed field is not indexed, but other fields in the document are processed normally. Accepts `true` or `false`.
185+
182186
<<null-value,`null_value`>>::
183187

184188
Accepts any of the true or false values listed above. The value is

server/src/main/java/org/elasticsearch/index/mapper/BooleanFieldMapper.java

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import org.apache.lucene.search.TermRangeQuery;
2323
import org.apache.lucene.util.BytesRef;
2424
import org.elasticsearch.Version;
25+
import org.elasticsearch.common.Explicit;
2526
import org.elasticsearch.common.lucene.Lucene;
2627
import org.elasticsearch.common.xcontent.support.XContentMapValues;
2728
import org.elasticsearch.core.Booleans;
@@ -84,7 +85,7 @@ public static class Builder extends FieldMapper.Builder {
8485
private final Parameter<Boolean> docValues = Parameter.docValuesParam(m -> toType(m).hasDocValues, true);
8586
private final Parameter<Boolean> indexed = Parameter.indexParam(m -> toType(m).indexed, true);
8687
private final Parameter<Boolean> stored = Parameter.storeParam(m -> toType(m).stored, false);
87-
88+
private final Parameter<Explicit<Boolean>> ignoreMalformed;
8889
private final Parameter<Boolean> nullValue = new Parameter<>(
8990
"null_value",
9091
false,
@@ -104,17 +105,23 @@ public static class Builder extends FieldMapper.Builder {
104105

105106
private final Version indexCreatedVersion;
106107

107-
public Builder(String name, ScriptCompiler scriptCompiler, Version indexCreatedVersion) {
108+
public Builder(String name, ScriptCompiler scriptCompiler, boolean ignoreMalformedByDefault, Version indexCreatedVersion) {
108109
super(name);
109110
this.scriptCompiler = Objects.requireNonNull(scriptCompiler);
110111
this.indexCreatedVersion = Objects.requireNonNull(indexCreatedVersion);
111-
this.script.precludesParameters(nullValue);
112+
this.ignoreMalformed = Parameter.explicitBoolParam(
113+
"ignore_malformed",
114+
true,
115+
m -> toType(m).ignoreMalformed,
116+
ignoreMalformedByDefault
117+
);
118+
this.script.precludesParameters(ignoreMalformed, nullValue);
112119
addScriptValidation(script, indexed, docValues);
113120
}
114121

115122
@Override
116123
protected Parameter<?>[] getParameters() {
117-
return new Parameter<?>[] { meta, docValues, indexed, nullValue, stored, script, onScriptError };
124+
return new Parameter<?>[] { meta, docValues, indexed, nullValue, stored, script, onScriptError, ignoreMalformed };
118125
}
119126

120127
@Override
@@ -148,7 +155,7 @@ private FieldValues<Boolean> scriptValues() {
148155
private static final Version MINIMUM_COMPATIBILITY_VERSION = Version.fromString("5.0.0");
149156

150157
public static final TypeParser PARSER = new TypeParser(
151-
(n, c) -> new Builder(n, c.scriptCompiler(), c.indexVersionCreated()),
158+
(n, c) -> new Builder(n, c.scriptCompiler(), IGNORE_MALFORMED_SETTING.get(c.getSettings()), c.indexVersionCreated()),
152159
MINIMUM_COMPATIBILITY_VERSION
153160
);
154161

@@ -367,6 +374,8 @@ public Query rangeQuery(
367374
private final FieldValues<Boolean> scriptValues;
368375
private final ScriptCompiler scriptCompiler;
369376
private final Version indexCreatedVersion;
377+
private final Explicit<Boolean> ignoreMalformed;
378+
private final boolean ignoreMalformedByDefault;
370379

371380
protected BooleanFieldMapper(
372381
String simpleName,
@@ -384,6 +393,8 @@ protected BooleanFieldMapper(
384393
this.scriptValues = builder.scriptValues();
385394
this.scriptCompiler = builder.scriptCompiler;
386395
this.indexCreatedVersion = builder.indexCreatedVersion;
396+
this.ignoreMalformed = builder.ignoreMalformed.getValue();
397+
this.ignoreMalformedByDefault = builder.ignoreMalformed.getDefaultValue().value();
387398
}
388399

389400
@Override
@@ -409,7 +420,15 @@ protected void parseCreateField(DocumentParserContext context) throws IOExceptio
409420
value = nullValue;
410421
}
411422
} else {
412-
value = context.parser().booleanValue();
423+
try {
424+
value = context.parser().booleanValue();
425+
} catch (IllegalArgumentException e) {
426+
if (ignoreMalformed.value() && context.parser().currentToken().isValue()) {
427+
context.addIgnoredField(mappedFieldType.name());
428+
} else {
429+
throw e;
430+
}
431+
}
413432
}
414433
indexValue(context, value);
415434
}
@@ -443,7 +462,7 @@ protected void indexScriptValues(
443462

444463
@Override
445464
public FieldMapper.Builder getMergeBuilder() {
446-
return new Builder(simpleName(), scriptCompiler, indexCreatedVersion).init(this);
465+
return new Builder(simpleName(), scriptCompiler, ignoreMalformedByDefault, indexCreatedVersion).init(this);
447466
}
448467

449468
@Override

server/src/main/java/org/elasticsearch/index/mapper/DynamicFieldsBuilder.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,8 +355,15 @@ public void newDynamicDoubleField(DocumentParserContext context, String name) th
355355

356356
@Override
357357
public void newDynamicBooleanField(DocumentParserContext context, String name) throws IOException {
358+
Settings settings = context.indexSettings().getSettings();
359+
boolean ignoreMalformed = FieldMapper.IGNORE_MALFORMED_SETTING.get(settings);
358360
createDynamicField(
359-
new BooleanFieldMapper.Builder(name, ScriptCompiler.NONE, context.indexSettings().getIndexVersionCreated()),
361+
new BooleanFieldMapper.Builder(
362+
name,
363+
ScriptCompiler.NONE,
364+
ignoreMalformed,
365+
context.indexSettings().getIndexVersionCreated()
366+
),
360367
context
361368
);
362369
}

server/src/test/java/org/elasticsearch/index/mapper/BooleanScriptFieldTypeTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ protected Query randomTermsQuery(MappedFieldType ft, SearchExecutionContext ctx)
319319
}
320320

321321
public void testDualingQueries() throws IOException {
322-
BooleanFieldMapper ootb = new BooleanFieldMapper.Builder("foo", ScriptCompiler.NONE, Version.CURRENT).build(
322+
BooleanFieldMapper ootb = new BooleanFieldMapper.Builder("foo", ScriptCompiler.NONE,false, Version.CURRENT).build(
323323
MapperBuilderContext.root(false)
324324
);
325325
try (Directory directory = newDirectory(); RandomIndexWriter iw = new RandomIndexWriter(random(), directory)) {

server/src/test/java/org/elasticsearch/index/mapper/FieldAliasMapperValidationTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ public void testFieldAliasWithDifferentNestedScopes() {
158158
}
159159

160160
private static FieldMapper createFieldMapper(String parent, String name) {
161-
return new BooleanFieldMapper.Builder(name, ScriptCompiler.NONE, Version.CURRENT).build(new MapperBuilderContext(parent, false));
161+
return new BooleanFieldMapper.Builder(name, ScriptCompiler.NONE,false, Version.CURRENT).build(new MapperBuilderContext(parent, false));
162162
}
163163

164164
private static ObjectMapper createObjectMapper(String name) {

server/src/test/java/org/elasticsearch/index/mapper/MultiFieldsSerializationTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public void testSorting() {
4040
builder.add(new BooleanFieldMapper.Builder(name, ScriptCompiler.NONE, Version.CURRENT));
4141
}
4242

43-
Mapper.Builder root = new BooleanFieldMapper.Builder("root", ScriptCompiler.NONE, Version.CURRENT);
43+
Mapper.Builder root = new BooleanFieldMapper.Builder("root", ScriptCompiler.NONE, false, Version.CURRENT);
4444
FieldMapper.MultiFields multiFields = builder.build(root, MapperBuilderContext.root(false));
4545

4646
String serialized = Strings.toString(multiFields);

0 commit comments

Comments
 (0)