@@ -118,16 +118,36 @@ public static class Builder extends ParametrizedFieldMapper.Builder {
118
118
119
119
private final RangeType type ;
120
120
private final Version indexCreatedVersion ;
121
+ private final boolean ignoreMalformedByDefault ;
122
+ private final Parameter <Boolean > ignoreMalformed ;
121
123
122
124
public Builder (String name , RangeType type , Settings settings ) {
123
- this (name , type , COERCE_SETTING .get (settings ), hasIndexCreated (settings ) ? Version .indexCreated (settings ) : null );
125
+ this (
126
+ name ,
127
+ type ,
128
+ COERCE_SETTING .get (settings ),
129
+ IGNORE_MALFORMED_SETTING .get (settings ),
130
+ hasIndexCreated (settings ) ? Version .indexCreated (settings ) : null
131
+ );
124
132
}
125
133
126
134
public Builder (String name , RangeType type , boolean coerceByDefault , Version indexCreatedVersion ) {
135
+ this (name , type , coerceByDefault , false /* ignoreMalformedByDefault */ , indexCreatedVersion );
136
+ }
137
+
138
+ public Builder (
139
+ String name ,
140
+ RangeType type ,
141
+ boolean coerceByDefault ,
142
+ boolean ignoreMalformedByDefault ,
143
+ Version indexCreatedVersion
144
+ ) {
127
145
super (name );
128
146
this .type = type ;
129
147
this .coerce = Parameter .explicitBoolParam ("coerce" , true , m -> toType (m ).coerce , coerceByDefault );
130
148
this .indexCreatedVersion = indexCreatedVersion ;
149
+ this .ignoreMalformedByDefault = ignoreMalformedByDefault ;
150
+ this .ignoreMalformed = Parameter .boolParam ("ignore_malformed" , true , m -> toType (m ).ignoreMalformed , ignoreMalformedByDefault );
131
151
if (this .type != RangeType .DATE ) {
132
152
format .neverSerialize ();
133
153
locale .neverSerialize ();
@@ -145,7 +165,7 @@ Builder format(String format) {
145
165
146
166
@ Override
147
167
protected List <Parameter <?>> getParameters () {
148
- return Arrays .asList (index , hasDocValues , store , coerce , format , locale , boost , meta );
168
+ return Arrays .asList (index , hasDocValues , store , coerce , format , locale , boost , meta , ignoreMalformed );
149
169
}
150
170
151
171
protected RangeFieldType setupFieldType (BuilderContext context ) {
@@ -378,6 +398,8 @@ public Query rangeQuery(
378
398
379
399
private final boolean coerceByDefault ;
380
400
private final Version indexCreatedVersion ;
401
+ private final boolean ignoreMalformed ;
402
+ private final boolean ignoreMalformedByDefault ;
381
403
382
404
private RangeFieldMapper (
383
405
String simpleName ,
@@ -397,6 +419,8 @@ private RangeFieldMapper(
397
419
this .locale = builder .locale .getValue ();
398
420
this .coerceByDefault = builder .coerce .getDefaultValue ().value ();
399
421
this .indexCreatedVersion = builder .indexCreatedVersion ;
422
+ this .ignoreMalformed = builder .ignoreMalformed .getValue ();
423
+ this .ignoreMalformedByDefault = builder .ignoreMalformedByDefault ;
400
424
}
401
425
402
426
boolean coerce () {
@@ -405,7 +429,7 @@ boolean coerce() {
405
429
406
430
@ Override
407
431
public ParametrizedFieldMapper .Builder getMergeBuilder () {
408
- return new Builder (simpleName (), type , coerceByDefault , indexCreatedVersion ).init (this );
432
+ return new Builder (simpleName (), type , coerceByDefault , ignoreMalformedByDefault , indexCreatedVersion ).init (this );
409
433
}
410
434
411
435
@ Override
@@ -442,40 +466,65 @@ protected void parseCreateField(ParseContext context) throws IOException {
442
466
boolean includeFrom = DEFAULT_INCLUDE_LOWER ;
443
467
boolean includeTo = DEFAULT_INCLUDE_UPPER ;
444
468
XContentParser .Token token ;
469
+ boolean rangeIsMalformed = false ;
445
470
while ((token = parser .nextToken ()) != XContentParser .Token .END_OBJECT ) {
446
471
if (token == XContentParser .Token .FIELD_NAME ) {
447
472
fieldName = parser .currentName ();
448
473
} else {
449
- if (fieldName .equals (GT_FIELD .getPreferredName ())) {
450
- includeFrom = false ;
451
- if (parser .currentToken () != XContentParser .Token .VALUE_NULL ) {
452
- from = rangeType .parseFrom (fieldType , parser , coerce .value (), includeFrom );
453
- }
454
- } else if (fieldName .equals (GTE_FIELD .getPreferredName ())) {
455
- includeFrom = true ;
456
- if (parser .currentToken () != XContentParser .Token .VALUE_NULL ) {
457
- from = rangeType .parseFrom (fieldType , parser , coerce .value (), includeFrom );
474
+ try {
475
+ if (fieldName .equals (GT_FIELD .getPreferredName ())) {
476
+ includeFrom = false ;
477
+ if (parser .currentToken () != XContentParser .Token .VALUE_NULL ) {
478
+ from = rangeType .parseFrom (fieldType , parser , coerce .value (), includeFrom );
479
+ }
480
+ } else if (fieldName .equals (GTE_FIELD .getPreferredName ())) {
481
+ includeFrom = true ;
482
+ if (parser .currentToken () != XContentParser .Token .VALUE_NULL ) {
483
+ from = rangeType .parseFrom (fieldType , parser , coerce .value (), includeFrom );
484
+ }
485
+ } else if (fieldName .equals (LT_FIELD .getPreferredName ())) {
486
+ includeTo = false ;
487
+ if (parser .currentToken () != XContentParser .Token .VALUE_NULL ) {
488
+ to = rangeType .parseTo (fieldType , parser , coerce .value (), includeTo );
489
+ }
490
+ } else if (fieldName .equals (LTE_FIELD .getPreferredName ())) {
491
+ includeTo = true ;
492
+ if (parser .currentToken () != XContentParser .Token .VALUE_NULL ) {
493
+ to = rangeType .parseTo (fieldType , parser , coerce .value (), includeTo );
494
+ }
495
+ } else {
496
+ throw new MapperParsingException (
497
+ "error parsing field [" + name () + "], with unknown parameter [" + fieldName + "]"
498
+ );
458
499
}
459
- } else if (fieldName .equals (LT_FIELD .getPreferredName ())) {
460
- includeTo = false ;
461
- if (parser .currentToken () != XContentParser .Token .VALUE_NULL ) {
462
- to = rangeType .parseTo (fieldType , parser , coerce .value (), includeTo );
500
+ } catch (final IllegalArgumentException e ) {
501
+ // We have to consume the JSON object in full
502
+ if (ignoreMalformed ) {
503
+ rangeIsMalformed = true ;
504
+ } else {
505
+ throw e ;
463
506
}
464
- } else if (fieldName .equals (LTE_FIELD .getPreferredName ())) {
465
- includeTo = true ;
466
- if (parser .currentToken () != XContentParser .Token .VALUE_NULL ) {
467
- to = rangeType .parseTo (fieldType , parser , coerce .value (), includeTo );
468
- }
469
- } else {
470
- throw new MapperParsingException (
471
- "error parsing field [" + name () + "], with unknown parameter [" + fieldName + "]"
472
- );
473
507
}
474
508
}
475
509
}
510
+
511
+ if (rangeIsMalformed ) {
512
+ context .addIgnoredField (fieldType ().name ());
513
+ return ;
514
+ }
515
+
476
516
range = new Range (rangeType , from , to , includeFrom , includeTo );
477
517
} else if (fieldType ().rangeType == RangeType .IP && start == XContentParser .Token .VALUE_STRING ) {
478
- range = parseIpRangeFromCidr (parser );
518
+ try {
519
+ range = parseIpRangeFromCidr (parser );
520
+ } catch (IllegalArgumentException e ) {
521
+ if (ignoreMalformed ) {
522
+ context .addIgnoredField (fieldType ().name ());
523
+ return ;
524
+ } else {
525
+ throw e ;
526
+ }
527
+ }
479
528
} else {
480
529
throw new MapperParsingException (
481
530
"error parsing field [" + name () + "], expected an object but got " + parser .currentName ()
0 commit comments