@Override
 public StringFieldMapper build(BuilderContext context) {
   if (positionOffsetGap > 0) {
     indexAnalyzer = new NamedCustomAnalyzer(indexAnalyzer, positionOffsetGap);
     searchAnalyzer = new NamedCustomAnalyzer(searchAnalyzer, positionOffsetGap);
     searchQuotedAnalyzer = new NamedCustomAnalyzer(searchQuotedAnalyzer, positionOffsetGap);
   }
   // if the field is not analyzed, then by default, we should omit norms and have docs only
   // index options, as probably what the user really wants
   // if they are set explicitly, we will use those values
   if (fieldType.indexed() && !fieldType.tokenized()) {
     if (!omitNormsSet && boost == Defaults.BOOST) {
       fieldType.setOmitNorms(true);
     }
     if (!indexOptionsSet) {
       fieldType.setIndexOptions(IndexOptions.DOCS_ONLY);
     }
   }
   StringFieldMapper fieldMapper =
       new StringFieldMapper(
           buildNames(context),
           boost,
           fieldType,
           nullValue,
           indexAnalyzer,
           searchAnalyzer,
           searchQuotedAnalyzer,
           positionOffsetGap,
           ignoreAbove,
           provider,
           similarity);
   fieldMapper.includeInAll(includeInAll);
   return fieldMapper;
 }
 @Override
 public StringFieldMapper unsetIncludeInAll() {
   if (includeInAll != null) {
     StringFieldMapper clone = clone();
     clone.includeInAll = null;
     return clone;
   } else {
     return this;
   }
 }
 @Override
 public StringFieldMapper includeInAllIfNotSet(Boolean includeInAll) {
   if (includeInAll != null && this.includeInAll == null) {
     StringFieldMapper clone = clone();
     clone.includeInAll = includeInAll;
     return clone;
   } else {
     return this;
   }
 }
 @Override
 public StringFieldMapper build(BuilderContext context) {
   if (positionOffsetGap > 0) {
     indexAnalyzer = new NamedAnalyzer(indexAnalyzer, positionOffsetGap);
     searchAnalyzer = new NamedAnalyzer(searchAnalyzer, positionOffsetGap);
     searchQuotedAnalyzer = new NamedAnalyzer(searchQuotedAnalyzer, positionOffsetGap);
   }
   // if the field is not analyzed, then by default, we should omit norms and have docs only
   // index options, as probably what the user really wants
   // if they are set explicitly, we will use those values
   // we also change the values on the default field type so that toXContent emits what
   // differs from the defaults
   FieldType defaultFieldType = new FieldType(Defaults.FIELD_TYPE);
   if (fieldType.indexOptions() != IndexOptions.NONE && !fieldType.tokenized()) {
     defaultFieldType.setOmitNorms(true);
     defaultFieldType.setIndexOptions(IndexOptions.DOCS);
     if (!omitNormsSet && boost == Defaults.BOOST) {
       fieldType.setOmitNorms(true);
     }
     if (!indexOptionsSet) {
       fieldType.setIndexOptions(IndexOptions.DOCS);
     }
   }
   defaultFieldType.freeze();
   StringFieldMapper fieldMapper =
       new StringFieldMapper(
           buildNames(context),
           boost,
           fieldType,
           defaultFieldType,
           docValues,
           nullValue,
           indexAnalyzer,
           searchAnalyzer,
           searchQuotedAnalyzer,
           positionOffsetGap,
           ignoreAbove,
           similarity,
           normsLoading,
           fieldDataSettings,
           context.indexSettings(),
           multiFieldsBuilder.build(this, context),
           copyTo);
   fieldMapper.includeInAll(includeInAll);
   return fieldMapper;
 }
 @Override
 public StringFieldMapper build(BuilderContext context) {
   if (positionIncrementGap != POSITION_INCREMENT_GAP_USE_ANALYZER) {
     fieldType.setIndexAnalyzer(
         new NamedAnalyzer(fieldType.indexAnalyzer(), positionIncrementGap));
     fieldType.setSearchAnalyzer(
         new NamedAnalyzer(fieldType.searchAnalyzer(), positionIncrementGap));
     fieldType.setSearchQuoteAnalyzer(
         new NamedAnalyzer(fieldType.searchQuoteAnalyzer(), positionIncrementGap));
   }
   // if the field is not analyzed, then by default, we should omit norms and have docs only
   // index options, as probably what the user really wants
   // if they are set explicitly, we will use those values
   // we also change the values on the default field type so that toXContent emits what
   // differs from the defaults
   if (fieldType.indexOptions() != IndexOptions.NONE && !fieldType.tokenized()) {
     defaultFieldType.setOmitNorms(true);
     defaultFieldType.setIndexOptions(IndexOptions.DOCS);
     if (!omitNormsSet && fieldType.boost() == 1.0f) {
       fieldType.setOmitNorms(true);
     }
     if (!indexOptionsSet) {
       fieldType.setIndexOptions(IndexOptions.DOCS);
     }
   }
   setupFieldType(context);
   StringFieldMapper fieldMapper =
       new StringFieldMapper(
           name,
           fieldType,
           defaultFieldType,
           positionIncrementGap,
           ignoreAbove,
           context.indexSettings(),
           multiFieldsBuilder.build(this, context),
           copyTo);
   return fieldMapper.includeInAll(includeInAll);
 }