@Override
  public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
    rootObjectMapper.toXContent(
        builder,
        params,
        new ToXContent() {
          @Override
          public XContentBuilder toXContent(XContentBuilder builder, Params params)
              throws IOException {
            if (indexAnalyzer != null
                && searchAnalyzer != null
                && indexAnalyzer.name().equals(searchAnalyzer.name())
                && !indexAnalyzer.name().startsWith("_")) {
              if (!indexAnalyzer.name().equals("default")) {
                // same analyzers, output it once
                builder.field("analyzer", indexAnalyzer.name());
              }
            } else {
              if (indexAnalyzer != null && !indexAnalyzer.name().startsWith("_")) {
                if (!indexAnalyzer.name().equals("default")) {
                  builder.field("index_analyzer", indexAnalyzer.name());
                }
              }
              if (searchAnalyzer != null && !searchAnalyzer.name().startsWith("_")) {
                if (!searchAnalyzer.name().equals("default")) {
                  builder.field("search_analyzer", searchAnalyzer.name());
                }
              }
            }

            if (meta != null && !meta.isEmpty()) {
              builder.field("_meta", meta());
            }
            return builder;
          }
          // no need to pass here id and boost, since they are added to the root object mapper
          // in the constructor
        },
        rootMappersNotIncludedInObject);
    return builder;
  }