@Override
  protected void innerParseCreateField(ParseContext context, List<Field> fields)
      throws IOException {
    String ipAsString;
    if (context.externalValueSet()) {
      ipAsString = (String) context.externalValue();
      if (ipAsString == null) {
        ipAsString = nullValue;
      }
    } else {
      if (context.parser().currentToken() == XContentParser.Token.VALUE_NULL) {
        ipAsString = nullValue;
      } else {
        ipAsString = context.parser().text();
      }
    }

    if (ipAsString == null) {
      return;
    }
    if (context.includeInAll(includeInAll, this)) {
      context.allEntries().addText(names.fullName(), ipAsString, boost);
    }

    final long value = ipToLong(ipAsString);
    if (fieldType.indexOptions() != IndexOptions.NONE || fieldType.stored()) {
      CustomLongNumericField field = new CustomLongNumericField(this, value, fieldType);
      field.setBoost(boost);
      fields.add(field);
    }
    if (hasDocValues()) {
      addDocValue(context, fields, value);
    }
  }
  @Override
  protected void innerParseCreateField(ParseContext context, List<Field> fields)
      throws IOException {
    String dateAsString = null;
    Long value = null;
    float boost = this.boost;
    if (context.externalValueSet()) {
      Object externalValue = context.externalValue();
      if (externalValue instanceof Number) {
        value = ((Number) externalValue).longValue();
      } else {
        dateAsString = (String) externalValue;
        if (dateAsString == null) {
          dateAsString = nullValue;
        }
      }
    } else {
      XContentParser parser = context.parser();
      XContentParser.Token token = parser.currentToken();
      if (token == XContentParser.Token.VALUE_NULL) {
        dateAsString = nullValue;
      } else if (token == XContentParser.Token.VALUE_NUMBER) {
        value = parser.longValue(coerce.value());
      } else if (token == XContentParser.Token.START_OBJECT) {
        String currentFieldName = null;
        while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
          if (token == XContentParser.Token.FIELD_NAME) {
            currentFieldName = parser.currentName();
          } else {
            if ("value".equals(currentFieldName) || "_value".equals(currentFieldName)) {
              if (token == XContentParser.Token.VALUE_NULL) {
                dateAsString = nullValue;
              } else if (token == XContentParser.Token.VALUE_NUMBER) {
                value = parser.longValue(coerce.value());
              } else {
                dateAsString = parser.text();
              }
            } else if ("boost".equals(currentFieldName) || "_boost".equals(currentFieldName)) {
              boost = parser.floatValue();
            } else {
              throw new ElasticsearchIllegalArgumentException(
                  "unknown property [" + currentFieldName + "]");
            }
          }
        }
      } else {
        dateAsString = parser.text();
      }
    }

    if (dateAsString != null) {
      assert value == null;
      if (context.includeInAll(includeInAll, this)) {
        context.allEntries().addText(names.fullName(), dateAsString, boost);
      }
      value = parseStringValue(dateAsString);
    }

    if (value != null) {
      if (fieldType.indexOptions() != IndexOptions.NONE || fieldType.stored()) {
        CustomLongNumericField field = new CustomLongNumericField(this, value, fieldType);
        field.setBoost(boost);
        fields.add(field);
      }
      if (hasDocValues()) {
        addDocValue(context, fields, value);
      }
    }
  }