From 2ad682e8b405bdb995dcdece9c6895cf94d5b2c9 Mon Sep 17 00:00:00 2001 From: Ryan Ernst Date: Mon, 20 Jul 2015 17:35:44 -0700 Subject: [PATCH] Mappings: Remove index name from mapping parser The index name was passed along through many levels of mapping parsing, just so that it could be used for _index. However, the index name is really metadata that should exist alongside things like type and id in SourceToParse. This change moves index name to SourceToParse, and eliminates it from the DocumentMapperParser. --- .../action/bulk/TransportShardBulkAction.java | 2 +- .../action/index/TransportIndexAction.java | 2 +- .../replication/TransportReplicationAction.java | 2 +- .../index/mapper/DocumentMapper.java | 16 +++++++++------- .../index/mapper/DocumentMapperParser.java | 12 +++++------- .../index/mapper/DocumentParser.java | 6 ++---- .../index/mapper/MapperBuilders.java | 4 ++-- .../index/mapper/MapperService.java | 2 +- .../elasticsearch/index/mapper/ParseContext.java | 7 ++----- .../index/mapper/SourceToParse.java | 15 +++++++++++++-- .../index/shard/TranslogRecoveryPerformer.java | 2 +- .../termvectors/ShardTermVectorsService.java | 2 +- .../percolator/PercolatorService.java | 12 ++++++------ .../index/engine/InternalEngineTests.java | 4 ++-- .../index/mapper/DynamicMappingTests.java | 2 +- .../index/mapper/index/IndexTypeMapperTests.java | 4 ++-- .../index/mapper/multifield/MultiFieldTests.java | 2 +- .../index/mapper/simple/SimpleMapperTests.java | 4 ++-- 18 files changed, 53 insertions(+), 47 deletions(-) diff --git a/core/src/main/java/org/elasticsearch/action/bulk/TransportShardBulkAction.java b/core/src/main/java/org/elasticsearch/action/bulk/TransportShardBulkAction.java index 70b3e1d7ac5..2ca2dfe142a 100644 --- a/core/src/main/java/org/elasticsearch/action/bulk/TransportShardBulkAction.java +++ b/core/src/main/java/org/elasticsearch/action/bulk/TransportShardBulkAction.java @@ -457,7 +457,7 @@ public class TransportShardBulkAction extends TransportReplicationAction sourceTransforms = new ArrayList<>(1); - private final String index; - private final Settings indexSettings; private final RootObjectMapper rootObjectMapper; @@ -94,8 +92,7 @@ public class DocumentMapper implements ToXContent { private final Mapper.BuilderContext builderContext; - public Builder(String index, Settings indexSettings, RootObjectMapper.Builder builder, MapperService mapperService) { - this.index = index; + public Builder(Settings indexSettings, RootObjectMapper.Builder builder, MapperService mapperService) { this.indexSettings = indexSettings; this.builderContext = new Mapper.BuilderContext(indexSettings, new ContentPath(1)); this.rootObjectMapper = builder.build(builderContext); @@ -150,7 +147,7 @@ public class DocumentMapper implements ToXContent { public DocumentMapper build(MapperService mapperService, DocumentMapperParser docMapperParser) { Preconditions.checkNotNull(rootObjectMapper, "Mapper builder must have the root object mapper set"); - return new DocumentMapper(mapperService, index, indexSettings, docMapperParser, rootObjectMapper, meta, rootMappers, sourceTransforms, mapperService.mappingLock); + return new DocumentMapper(mapperService, indexSettings, docMapperParser, rootObjectMapper, meta, rootMappers, sourceTransforms, mapperService.mappingLock); } } @@ -176,7 +173,7 @@ public class DocumentMapper implements ToXContent { private final ReleasableLock mappingWriteLock; private final ReentrantReadWriteLock mappingLock; - public DocumentMapper(MapperService mapperService, String index, @Nullable Settings indexSettings, DocumentMapperParser docMapperParser, + public DocumentMapper(MapperService mapperService, @Nullable Settings indexSettings, DocumentMapperParser docMapperParser, RootObjectMapper rootObjectMapper, ImmutableMap meta, Map, MetadataFieldMapper> rootMappers, @@ -191,7 +188,7 @@ public class DocumentMapper implements ToXContent { rootMappers.values().toArray(new MetadataFieldMapper[rootMappers.values().size()]), sourceTransforms.toArray(new SourceTransform[sourceTransforms.size()]), meta); - this.documentParser = new DocumentParser(index, indexSettings, docMapperParser, this, new ReleasableLock(mappingLock.readLock())); + this.documentParser = new DocumentParser(indexSettings, docMapperParser, this, new ReleasableLock(mappingLock.readLock())); this.typeFilter = typeMapper().fieldType().termQuery(type, null); this.mappingWriteLock = new ReleasableLock(mappingLock.writeLock()); @@ -325,6 +322,11 @@ public class DocumentMapper implements ToXContent { return this.objectMappers; } + public ParsedDocument parse(String index, String type, String id, BytesReference source) throws MapperParsingException { + return parse(SourceToParse.source(source).index(index).type(type).id(id)); + } + + // TODO: remove this, replace all uses with version including index above public ParsedDocument parse(String type, String id, BytesReference source) throws MapperParsingException { return parse(SourceToParse.source(source).type(type).id(id)); } diff --git a/core/src/main/java/org/elasticsearch/index/mapper/DocumentMapperParser.java b/core/src/main/java/org/elasticsearch/index/mapper/DocumentMapperParser.java index 013c2891f06..7b572becf10 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/DocumentMapperParser.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/DocumentMapperParser.java @@ -56,11 +56,9 @@ import java.util.Map; import static org.elasticsearch.index.mapper.MapperBuilders.doc; -/** - * - */ -public class DocumentMapperParser extends AbstractIndexComponent { +public class DocumentMapperParser { + private final Settings indexSettings; final MapperService mapperService; final AnalysisService analysisService; private static final ESLogger logger = Loggers.getLogger(DocumentMapperParser.class); @@ -76,9 +74,9 @@ public class DocumentMapperParser extends AbstractIndexComponent { private volatile ImmutableMap typeParsers; private volatile ImmutableMap rootTypeParsers; - public DocumentMapperParser(Index index, @IndexSettings Settings indexSettings, MapperService mapperService, AnalysisService analysisService, + public DocumentMapperParser(@IndexSettings Settings indexSettings, MapperService mapperService, AnalysisService analysisService, SimilarityLookupService similarityLookupService, ScriptService scriptService) { - super(index, indexSettings); + this.indexSettings = indexSettings; this.parseFieldMatcher = new ParseFieldMatcher(indexSettings); this.mapperService = mapperService; this.analysisService = analysisService; @@ -205,7 +203,7 @@ public class DocumentMapperParser extends AbstractIndexComponent { Mapper.TypeParser.ParserContext parserContext = parserContext(); // parse RootObjectMapper - DocumentMapper.Builder docBuilder = doc(index.name(), indexSettings, (RootObjectMapper.Builder) rootObjectTypeParser.parse(type, mapping, parserContext), mapperService); + DocumentMapper.Builder docBuilder = doc(indexSettings, (RootObjectMapper.Builder) rootObjectTypeParser.parse(type, mapping, parserContext), mapperService); Iterator> iterator = mapping.entrySet().iterator(); // parse DocumentMapper while(iterator.hasNext()) { diff --git a/core/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java b/core/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java index 523be1abddd..6aa66f20d6f 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/DocumentParser.java @@ -56,18 +56,16 @@ class DocumentParser implements Closeable { private CloseableThreadLocal cache = new CloseableThreadLocal() { @Override protected ParseContext.InternalParseContext initialValue() { - return new ParseContext.InternalParseContext(index, indexSettings, docMapperParser, docMapper, new ContentPath(0)); + return new ParseContext.InternalParseContext(indexSettings, docMapperParser, docMapper, new ContentPath(0)); } }; - private final String index; private final Settings indexSettings; private final DocumentMapperParser docMapperParser; private final DocumentMapper docMapper; private final ReleasableLock parseLock; - public DocumentParser(String index, Settings indexSettings, DocumentMapperParser docMapperParser, DocumentMapper docMapper, ReleasableLock parseLock) { - this.index = index; + public DocumentParser(Settings indexSettings, DocumentMapperParser docMapperParser, DocumentMapper docMapper, ReleasableLock parseLock) { this.indexSettings = indexSettings; this.docMapperParser = docMapperParser; this.docMapper = docMapper; diff --git a/core/src/main/java/org/elasticsearch/index/mapper/MapperBuilders.java b/core/src/main/java/org/elasticsearch/index/mapper/MapperBuilders.java index cc0b27b1713..73c92ded424 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/MapperBuilders.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/MapperBuilders.java @@ -32,8 +32,8 @@ public final class MapperBuilders { private MapperBuilders() {} - public static DocumentMapper.Builder doc(String index, Settings settings, RootObjectMapper.Builder objectBuilder, MapperService mapperService) { - return new DocumentMapper.Builder(index, settings, objectBuilder, mapperService); + public static DocumentMapper.Builder doc(Settings settings, RootObjectMapper.Builder objectBuilder, MapperService mapperService) { + return new DocumentMapper.Builder(settings, objectBuilder, mapperService); } public static RootObjectMapper.Builder rootObject(String name) { diff --git a/core/src/main/java/org/elasticsearch/index/mapper/MapperService.java b/core/src/main/java/org/elasticsearch/index/mapper/MapperService.java index 30efe7b25ab..cf5d9f4edbd 100755 --- a/core/src/main/java/org/elasticsearch/index/mapper/MapperService.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/MapperService.java @@ -146,7 +146,7 @@ public class MapperService extends AbstractIndexComponent { this.analysisService = analysisService; this.fieldDataService = fieldDataService; this.fieldTypes = new FieldTypeLookup(); - this.documentParser = new DocumentMapperParser(index, indexSettings, this, analysisService, similarityLookupService, scriptService); + this.documentParser = new DocumentMapperParser(indexSettings, this, analysisService, similarityLookupService, scriptService); this.indexAnalyzer = new MapperAnalyzerWrapper(analysisService.defaultIndexAnalyzer(), INDEX_ANALYZER_EXTRACTOR); this.searchAnalyzer = new MapperAnalyzerWrapper(analysisService.defaultSearchAnalyzer(), SEARCH_ANALYZER_EXTRACTOR); this.searchQuoteAnalyzer = new MapperAnalyzerWrapper(analysisService.defaultSearchQuoteAnalyzer(), SEARCH_QUOTE_ANALYZER_EXTRACTOR); diff --git a/core/src/main/java/org/elasticsearch/index/mapper/ParseContext.java b/core/src/main/java/org/elasticsearch/index/mapper/ParseContext.java index 2af7b2a687c..5c07e8a9192 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/ParseContext.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/ParseContext.java @@ -380,8 +380,6 @@ public abstract class ParseContext { private List documents = Lists.newArrayList(); - private final String index; - @Nullable private final Settings indexSettings; @@ -402,8 +400,7 @@ public abstract class ParseContext { private Mapper dynamicMappingsUpdate = null; - public InternalParseContext(String index, @Nullable Settings indexSettings, DocumentMapperParser docMapperParser, DocumentMapper docMapper, ContentPath path) { - this.index = index; + public InternalParseContext(@Nullable Settings indexSettings, DocumentMapperParser docMapperParser, DocumentMapper docMapper, ContentPath path) { this.indexSettings = indexSettings; this.docMapper = docMapper; this.docMapperParser = docMapperParser; @@ -443,7 +440,7 @@ public abstract class ParseContext { @Override public String index() { - return this.index; + return sourceToParse.index(); } @Override diff --git a/core/src/main/java/org/elasticsearch/index/mapper/SourceToParse.java b/core/src/main/java/org/elasticsearch/index/mapper/SourceToParse.java index d952530e3ef..e9d62c8e88d 100644 --- a/core/src/main/java/org/elasticsearch/index/mapper/SourceToParse.java +++ b/core/src/main/java/org/elasticsearch/index/mapper/SourceToParse.java @@ -47,6 +47,8 @@ public class SourceToParse { private boolean flyweight = false; + private String index; + private String type; private String id; @@ -59,13 +61,13 @@ public class SourceToParse { private long ttl; - public SourceToParse(Origin origin, XContentParser parser) { + private SourceToParse(Origin origin, XContentParser parser) { this.origin = origin; this.parser = parser; this.source = null; } - public SourceToParse(Origin origin, BytesReference source) { + private SourceToParse(Origin origin, BytesReference source) { this.origin = origin; // we always convert back to byte array, since we store it and Field only supports bytes.. // so, we might as well do it here, and improve the performance of working with direct byte arrays @@ -85,6 +87,15 @@ public class SourceToParse { return this.source; } + public String index() { + return this.index; + } + + public SourceToParse index(String index) { + this.index = index; + return this; + } + public String type() { return this.type; } diff --git a/core/src/main/java/org/elasticsearch/index/shard/TranslogRecoveryPerformer.java b/core/src/main/java/org/elasticsearch/index/shard/TranslogRecoveryPerformer.java index 1a54c748c33..8738e0abdf5 100644 --- a/core/src/main/java/org/elasticsearch/index/shard/TranslogRecoveryPerformer.java +++ b/core/src/main/java/org/elasticsearch/index/shard/TranslogRecoveryPerformer.java @@ -145,7 +145,7 @@ public class TranslogRecoveryPerformer { case CREATE: Translog.Create create = (Translog.Create) operation; Engine.Create engineCreate = IndexShard.prepareCreate(docMapper(create.type()), - source(create.source()).type(create.type()).id(create.id()) + source(create.source()).index(shardId.getIndex()).type(create.type()).id(create.id()) .routing(create.routing()).parent(create.parent()).timestamp(create.timestamp()).ttl(create.ttl()), create.version(), create.versionType().versionTypeForReplicationAndRecovery(), Engine.Operation.Origin.RECOVERY, true, false); maybeAddMappingUpdate(engineCreate.type(), engineCreate.parsedDoc().dynamicMappingsUpdate(), engineCreate.id(), allowMappingUpdates); diff --git a/core/src/main/java/org/elasticsearch/index/termvectors/ShardTermVectorsService.java b/core/src/main/java/org/elasticsearch/index/termvectors/ShardTermVectorsService.java index fb79a3990a7..0d107e19b46 100644 --- a/core/src/main/java/org/elasticsearch/index/termvectors/ShardTermVectorsService.java +++ b/core/src/main/java/org/elasticsearch/index/termvectors/ShardTermVectorsService.java @@ -309,7 +309,7 @@ public class ShardTermVectorsService extends AbstractIndexShardComponent { // TODO: make parsing not dynamically create fields not in the original mapping Tuple docMapper = mapperService.documentMapperWithAutoCreate(type); - ParsedDocument parsedDocument = docMapper.v1().parse(source(doc).type(type).flyweight(true)); + ParsedDocument parsedDocument = docMapper.v1().parse(source(doc).index(index).type(type).flyweight(true)); if (docMapper.v2() != null) { parsedDocument.addDynamicMappingsUpdate(docMapper.v2()); } diff --git a/core/src/main/java/org/elasticsearch/percolator/PercolatorService.java b/core/src/main/java/org/elasticsearch/percolator/PercolatorService.java index b035f3fb8b0..e92563723c6 100644 --- a/core/src/main/java/org/elasticsearch/percolator/PercolatorService.java +++ b/core/src/main/java/org/elasticsearch/percolator/PercolatorService.java @@ -182,13 +182,13 @@ public class PercolatorService extends AbstractComponent { ); SearchContext.setCurrent(context); try { - ParsedDocument parsedDocument = parseRequest(percolateIndexService, request, context); + ParsedDocument parsedDocument = parseRequest(percolateIndexService, request, context, request.shardId().getIndex()); if (context.percolateQueries().isEmpty()) { return new PercolateShardResponse(context, request.shardId()); } if (request.docSource() != null && request.docSource().length() != 0) { - parsedDocument = parseFetchedDoc(context, request.docSource(), percolateIndexService, request.documentType()); + parsedDocument = parseFetchedDoc(context, request.docSource(), percolateIndexService, request.shardId().getIndex(), request.documentType()); } else if (parsedDocument == null) { throw new IllegalArgumentException("Nothing to percolate"); } @@ -242,7 +242,7 @@ public class PercolatorService extends AbstractComponent { } } - private ParsedDocument parseRequest(IndexService documentIndexService, PercolateShardRequest request, PercolateContext context) { + private ParsedDocument parseRequest(IndexService documentIndexService, PercolateShardRequest request, PercolateContext context, String index) { BytesReference source = request.source(); if (source == null || source.length() == 0) { return null; @@ -276,7 +276,7 @@ public class PercolatorService extends AbstractComponent { MapperService mapperService = documentIndexService.mapperService(); Tuple docMapper = mapperService.documentMapperWithAutoCreate(request.documentType()); - doc = docMapper.v1().parse(source(parser).type(request.documentType()).flyweight(true)); + doc = docMapper.v1().parse(source(parser).index(index).type(request.documentType()).flyweight(true)); if (docMapper.v2() != null) { doc.addDynamicMappingsUpdate(docMapper.v2()); } @@ -378,14 +378,14 @@ public class PercolatorService extends AbstractComponent { } } - private ParsedDocument parseFetchedDoc(PercolateContext context, BytesReference fetchedDoc, IndexService documentIndexService, String type) { + private ParsedDocument parseFetchedDoc(PercolateContext context, BytesReference fetchedDoc, IndexService documentIndexService, String index, String type) { ParsedDocument doc = null; XContentParser parser = null; try { parser = XContentFactory.xContent(fetchedDoc).createParser(fetchedDoc); MapperService mapperService = documentIndexService.mapperService(); Tuple docMapper = mapperService.documentMapperWithAutoCreate(type); - doc = docMapper.v1().parse(source(parser).type(type).flyweight(true)); + doc = docMapper.v1().parse(source(parser).index(index).type(type).flyweight(true)); if (context.highlight() != null) { doc.setSource(fetchedDoc); diff --git a/core/src/test/java/org/elasticsearch/index/engine/InternalEngineTests.java b/core/src/test/java/org/elasticsearch/index/engine/InternalEngineTests.java index 6efe7868858..6856eb9d0ea 100644 --- a/core/src/test/java/org/elasticsearch/index/engine/InternalEngineTests.java +++ b/core/src/test/java/org/elasticsearch/index/engine/InternalEngineTests.java @@ -1924,8 +1924,8 @@ public class InternalEngineTests extends ElasticsearchTestCase { AnalysisService analysisService = new AnalysisService(index, settings); SimilarityLookupService similarityLookupService = new SimilarityLookupService(index, settings); MapperService mapperService = new MapperService(index, settings, analysisService, null, similarityLookupService, null); - DocumentMapper.Builder b = new DocumentMapper.Builder(indexName, settings, rootBuilder, mapperService); - DocumentMapperParser parser = new DocumentMapperParser(index, settings, mapperService, analysisService, similarityLookupService, null); + DocumentMapper.Builder b = new DocumentMapper.Builder(settings, rootBuilder, mapperService); + DocumentMapperParser parser = new DocumentMapperParser(settings, mapperService, analysisService, similarityLookupService, null); this.docMapper = b.build(mapperService, parser); } diff --git a/core/src/test/java/org/elasticsearch/index/mapper/DynamicMappingTests.java b/core/src/test/java/org/elasticsearch/index/mapper/DynamicMappingTests.java index f3877e4820c..b2526200f73 100644 --- a/core/src/test/java/org/elasticsearch/index/mapper/DynamicMappingTests.java +++ b/core/src/test/java/org/elasticsearch/index/mapper/DynamicMappingTests.java @@ -197,7 +197,7 @@ public class DynamicMappingTests extends ElasticsearchSingleNodeTest { private Mapper parse(DocumentMapper mapper, DocumentMapperParser parser, XContentBuilder builder) throws Exception { Settings settings = Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT).build(); - ParseContext.InternalParseContext ctx = new ParseContext.InternalParseContext("test", settings, parser, mapper, new ContentPath(0)); + ParseContext.InternalParseContext ctx = new ParseContext.InternalParseContext(settings, parser, mapper, new ContentPath(0)); SourceToParse source = SourceToParse.source(builder.bytes()); ctx.reset(XContentHelper.createParser(source.source()), new ParseContext.Document(), source); assertEquals(XContentParser.Token.START_OBJECT, ctx.parser().nextToken()); diff --git a/core/src/test/java/org/elasticsearch/index/mapper/index/IndexTypeMapperTests.java b/core/src/test/java/org/elasticsearch/index/mapper/index/IndexTypeMapperTests.java index 3a8accd6a64..196a4df4eb7 100644 --- a/core/src/test/java/org/elasticsearch/index/mapper/index/IndexTypeMapperTests.java +++ b/core/src/test/java/org/elasticsearch/index/mapper/index/IndexTypeMapperTests.java @@ -41,7 +41,7 @@ public class IndexTypeMapperTests extends ElasticsearchSingleNodeTest { IndexFieldMapper indexMapper = docMapper.indexMapper(); assertThat(indexMapper.enabled(), equalTo(true)); - ParsedDocument doc = docMapper.parse("type", "1", XContentFactory.jsonBuilder() + ParsedDocument doc = docMapper.parse("test", "type", "1", XContentFactory.jsonBuilder() .startObject() .field("field", "value") .endObject() @@ -131,7 +131,7 @@ public class IndexTypeMapperTests extends ElasticsearchSingleNodeTest { assertThat(indexMapper.enabled(), equalTo(true)); assertThat(indexMapper.fieldType().stored(), equalTo(true)); - ParsedDocument doc = docMapper.parse("type", "1", XContentFactory.jsonBuilder() + ParsedDocument doc = docMapper.parse("test", "type", "1", XContentFactory.jsonBuilder() .startObject() .field("field", "value") .endObject() diff --git a/core/src/test/java/org/elasticsearch/index/mapper/multifield/MultiFieldTests.java b/core/src/test/java/org/elasticsearch/index/mapper/multifield/MultiFieldTests.java index c7c08b834c9..5890fd89f53 100644 --- a/core/src/test/java/org/elasticsearch/index/mapper/multifield/MultiFieldTests.java +++ b/core/src/test/java/org/elasticsearch/index/mapper/multifield/MultiFieldTests.java @@ -151,7 +151,7 @@ public class MultiFieldTests extends ElasticsearchSingleNodeTest { Settings settings = indexService.settingsService().getSettings(); DocumentMapperParser mapperParser = indexService.mapperService().documentMapperParser(); - DocumentMapper builderDocMapper = doc("test", settings, rootObject("person").add( + DocumentMapper builderDocMapper = doc(settings, rootObject("person").add( stringField("name").store(true) .addMultiField(stringField("indexed").index(true).tokenized(true)) .addMultiField(stringField("not_indexed").index(false).store(true)) diff --git a/core/src/test/java/org/elasticsearch/index/mapper/simple/SimpleMapperTests.java b/core/src/test/java/org/elasticsearch/index/mapper/simple/SimpleMapperTests.java index cf50a1d819e..f6b4d208761 100644 --- a/core/src/test/java/org/elasticsearch/index/mapper/simple/SimpleMapperTests.java +++ b/core/src/test/java/org/elasticsearch/index/mapper/simple/SimpleMapperTests.java @@ -45,7 +45,7 @@ public class SimpleMapperTests extends ElasticsearchSingleNodeTest { IndexService indexService = createIndex("test"); Settings settings = indexService.settingsService().getSettings(); DocumentMapperParser mapperParser = indexService.mapperService().documentMapperParser(); - DocumentMapper docMapper = doc("test", settings, + DocumentMapper docMapper = doc(settings, rootObject("person") .add(object("name").add(stringField("first").store(true).index(false))), indexService.mapperService()).build(indexService.mapperService(), mapperParser); @@ -123,7 +123,7 @@ public class SimpleMapperTests extends ElasticsearchSingleNodeTest { IndexService indexService = createIndex("test"); Settings settings = indexService.settingsService().getSettings(); DocumentMapperParser mapperParser = indexService.mapperService().documentMapperParser(); - DocumentMapper docMapper = doc("test", settings, + DocumentMapper docMapper = doc(settings, rootObject("person") .add(object("name").add(stringField("first").store(true).index(false))), indexService.mapperService()).build(indexService.mapperService(), mapperParser);