Skip to content

Commit 1b66082

Browse files
authored
Allow _doc as a type. (#27816)
Allowing `_doc` as a type will enable users to make the transition to 7.0 smoother since the index APIs will be `PUT index/_doc/id` and `POST index/_doc`. This also moves most of the documentation to `_doc` as a type name. Closes #27750 Closes #27751
1 parent bb14b8f commit 1b66082

File tree

162 files changed

+884
-908
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

162 files changed

+884
-908
lines changed

core/src/main/java/org/elasticsearch/cluster/metadata/MetaDataMappingService.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,9 @@ private ClusterState applyRequest(ClusterState currentState, PutMappingClusterSt
293293
}
294294
assert mappingType != null;
295295

296-
if (!MapperService.DEFAULT_MAPPING.equals(mappingType) && mappingType.charAt(0) == '_') {
296+
if (MapperService.DEFAULT_MAPPING.equals(mappingType) == false
297+
&& MapperService.SINGLE_MAPPING_NAME.equals(mappingType) == false
298+
&& mappingType.charAt(0) == '_') {
297299
throw new InvalidTypeNameException("Document mapping type name can't start with '_', found: [" + mappingType + "]");
298300
}
299301
MetaData.Builder builder = MetaData.builder(metaData);

core/src/main/java/org/elasticsearch/index/mapper/MapperService.java

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ public enum MergeReason {
9090
}
9191

9292
public static final String DEFAULT_MAPPING = "_default_";
93+
public static final String SINGLE_MAPPING_NAME = "_doc";
9394
public static final Setting<Long> INDEX_MAPPING_NESTED_FIELDS_LIMIT_SETTING =
9495
Setting.longSetting("index.mapping.nested_fields.limit", 50L, 0, Property.Dynamic, Property.IndexScope);
9596
// maximum allowed number of nested json objects across all fields in a single document
@@ -338,6 +339,27 @@ private synchronized Map<String, DocumentMapper> internalMerge(Map<String, Compr
338339
return internalMerge(defaultMapper, defaultMappingSource, documentMappers, reason, updateAllTypes);
339340
}
340341

342+
static void validateTypeName(String type) {
343+
if (type.length() == 0) {
344+
throw new InvalidTypeNameException("mapping type name is empty");
345+
}
346+
if (type.length() > 255) {
347+
throw new InvalidTypeNameException("mapping type name [" + type + "] is too long; limit is length 255 but was [" + type.length() + "]");
348+
}
349+
if (type.charAt(0) == '_' && SINGLE_MAPPING_NAME.equals(type) == false) {
350+
throw new InvalidTypeNameException("mapping type name [" + type + "] can't start with '_' unless it is called [" + SINGLE_MAPPING_NAME + "]");
351+
}
352+
if (type.contains("#")) {
353+
throw new InvalidTypeNameException("mapping type name [" + type + "] should not include '#' in it");
354+
}
355+
if (type.contains(",")) {
356+
throw new InvalidTypeNameException("mapping type name [" + type + "] should not include ',' in it");
357+
}
358+
if (type.charAt(0) == '.') {
359+
throw new IllegalArgumentException("mapping type name [" + type + "] must not start with a '.'");
360+
}
361+
}
362+
341363
private synchronized Map<String, DocumentMapper> internalMerge(@Nullable DocumentMapper defaultMapper, @Nullable String defaultMappingSource,
342364
List<DocumentMapper> documentMappers, MergeReason reason, boolean updateAllTypes) {
343365
boolean hasNested = this.hasNested;
@@ -361,27 +383,10 @@ private synchronized Map<String, DocumentMapper> internalMerge(@Nullable Documen
361383

362384
for (DocumentMapper mapper : documentMappers) {
363385
// check naming
364-
if (mapper.type().length() == 0) {
365-
throw new InvalidTypeNameException("mapping type name is empty");
366-
}
367-
if (mapper.type().length() > 255) {
368-
throw new InvalidTypeNameException("mapping type name [" + mapper.type() + "] is too long; limit is length 255 but was [" + mapper.type().length() + "]");
369-
}
370-
if (mapper.type().charAt(0) == '_') {
371-
throw new InvalidTypeNameException("mapping type name [" + mapper.type() + "] can't start with '_'");
372-
}
373-
if (mapper.type().contains("#")) {
374-
throw new InvalidTypeNameException("mapping type name [" + mapper.type() + "] should not include '#' in it");
375-
}
376-
if (mapper.type().contains(",")) {
377-
throw new InvalidTypeNameException("mapping type name [" + mapper.type() + "] should not include ',' in it");
378-
}
386+
validateTypeName(mapper.type());
379387
if (mapper.type().equals(mapper.parentFieldMapper().type())) {
380388
throw new IllegalArgumentException("The [_parent.type] option can't point to the same type");
381389
}
382-
if (typeNameStartsWithIllegalDot(mapper)) {
383-
throw new IllegalArgumentException("mapping type name [" + mapper.type() + "] must not start with a '.'");
384-
}
385390

386391
// compute the merged DocumentMapper
387392
DocumentMapper oldMapper = mappers.get(mapper.type());
@@ -519,10 +524,6 @@ private boolean assertMappersShareSameFieldType() {
519524
return true;
520525
}
521526

522-
private boolean typeNameStartsWithIllegalDot(DocumentMapper mapper) {
523-
return mapper.type().startsWith(".");
524-
}
525-
526527
private boolean assertSerialization(DocumentMapper mapper) {
527528
// capture the source now, it may change due to concurrent parsing
528529
final CompressedXContent mappingSource = mapper.mappingSource();

core/src/test/java/org/elasticsearch/cluster/metadata/MetaDataTests.java

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -241,11 +241,11 @@ public void testFindMappings() throws IOException {
241241
.put(IndexMetaData.builder("index1")
242242
.settings(Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT)
243243
.put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, 1).put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 0))
244-
.putMapping("doc", FIND_MAPPINGS_TEST_ITEM))
244+
.putMapping("_doc", FIND_MAPPINGS_TEST_ITEM))
245245
.put(IndexMetaData.builder("index2")
246246
.settings(Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT)
247247
.put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, 1).put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 0))
248-
.putMapping("doc", FIND_MAPPINGS_TEST_ITEM)).build();
248+
.putMapping("_doc", FIND_MAPPINGS_TEST_ITEM)).build();
249249

250250
{
251251
ImmutableOpenMap<String, ImmutableOpenMap<String, MappingMetaData>> mappings = metaData.findMappings(Strings.EMPTY_ARRAY,
@@ -266,15 +266,15 @@ public void testFindMappings() throws IOException {
266266
{
267267
ImmutableOpenMap<String, ImmutableOpenMap<String, MappingMetaData>> mappings = metaData.findMappings(
268268
new String[]{"index1", "index2"},
269-
new String[]{randomBoolean() ? "doc" : "_all"}, MapperPlugin.NOOP_FIELD_FILTER);
269+
new String[]{randomBoolean() ? "_doc" : "_all"}, MapperPlugin.NOOP_FIELD_FILTER);
270270
assertEquals(2, mappings.size());
271271
assertIndexMappingsNotFiltered(mappings, "index1");
272272
assertIndexMappingsNotFiltered(mappings, "index2");
273273
}
274274
}
275275

276276
public void testFindMappingsNoOpFilters() throws IOException {
277-
MappingMetaData originalMappingMetaData = new MappingMetaData("doc",
277+
MappingMetaData originalMappingMetaData = new MappingMetaData("_doc",
278278
XContentHelper.convertToMap(JsonXContent.jsonXContent, FIND_MAPPINGS_TEST_ITEM, true));
279279

280280
MetaData metaData = MetaData.builder()
@@ -287,28 +287,28 @@ public void testFindMappingsNoOpFilters() throws IOException {
287287
ImmutableOpenMap<String, ImmutableOpenMap<String, MappingMetaData>> mappings = metaData.findMappings(new String[]{"index1"},
288288
randomBoolean() ? Strings.EMPTY_ARRAY : new String[]{"_all"}, MapperPlugin.NOOP_FIELD_FILTER);
289289
ImmutableOpenMap<String, MappingMetaData> index1 = mappings.get("index1");
290-
MappingMetaData mappingMetaData = index1.get("doc");
290+
MappingMetaData mappingMetaData = index1.get("_doc");
291291
assertSame(originalMappingMetaData, mappingMetaData);
292292
}
293293
{
294294
ImmutableOpenMap<String, ImmutableOpenMap<String, MappingMetaData>> mappings = metaData.findMappings(new String[]{"index1"},
295295
randomBoolean() ? Strings.EMPTY_ARRAY : new String[]{"_all"}, index -> field -> randomBoolean());
296296
ImmutableOpenMap<String, MappingMetaData> index1 = mappings.get("index1");
297-
MappingMetaData mappingMetaData = index1.get("doc");
297+
MappingMetaData mappingMetaData = index1.get("_doc");
298298
assertNotSame(originalMappingMetaData, mappingMetaData);
299299
}
300300
{
301301
ImmutableOpenMap<String, ImmutableOpenMap<String, MappingMetaData>> mappings = metaData.findMappings(new String[]{"index1"},
302-
new String[]{"doc"}, MapperPlugin.NOOP_FIELD_FILTER);
302+
new String[]{"_doc"}, MapperPlugin.NOOP_FIELD_FILTER);
303303
ImmutableOpenMap<String, MappingMetaData> index1 = mappings.get("index1");
304-
MappingMetaData mappingMetaData = index1.get("doc");
304+
MappingMetaData mappingMetaData = index1.get("_doc");
305305
assertSame(originalMappingMetaData, mappingMetaData);
306306
}
307307
{
308308
ImmutableOpenMap<String, ImmutableOpenMap<String, MappingMetaData>> mappings = metaData.findMappings(new String[]{"index1"},
309-
new String[]{"doc"}, index -> field -> randomBoolean());
309+
new String[]{"_doc"}, index -> field -> randomBoolean());
310310
ImmutableOpenMap<String, MappingMetaData> index1 = mappings.get("index1");
311-
MappingMetaData mappingMetaData = index1.get("doc");
311+
MappingMetaData mappingMetaData = index1.get("_doc");
312312
assertNotSame(originalMappingMetaData, mappingMetaData);
313313
}
314314
}
@@ -318,7 +318,7 @@ public void testFindMappingsWithFilters() throws IOException {
318318
String mapping = FIND_MAPPINGS_TEST_ITEM;
319319
if (randomBoolean()) {
320320
Map<String, Object> stringObjectMap = XContentHelper.convertToMap(JsonXContent.jsonXContent, FIND_MAPPINGS_TEST_ITEM, false);
321-
Map<String, Object> doc = (Map<String, Object>)stringObjectMap.get("doc");
321+
Map<String, Object> doc = (Map<String, Object>)stringObjectMap.get("_doc");
322322
try (XContentBuilder builder = JsonXContent.contentBuilder()) {
323323
builder.map(doc);
324324
mapping = builder.string();
@@ -329,20 +329,20 @@ public void testFindMappingsWithFilters() throws IOException {
329329
.put(IndexMetaData.builder("index1")
330330
.settings(Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT)
331331
.put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, 1).put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 0))
332-
.putMapping("doc", mapping))
332+
.putMapping("_doc", mapping))
333333
.put(IndexMetaData.builder("index2")
334334
.settings(Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT)
335335
.put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, 1).put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 0))
336-
.putMapping("doc", mapping))
336+
.putMapping("_doc", mapping))
337337
.put(IndexMetaData.builder("index3")
338338
.settings(Settings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.CURRENT)
339339
.put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, 1).put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 0))
340-
.putMapping("doc", mapping)).build();
340+
.putMapping("_doc", mapping)).build();
341341

342342
{
343343
ImmutableOpenMap<String, ImmutableOpenMap<String, MappingMetaData>> mappings = metaData.findMappings(
344344
new String[]{"index1", "index2", "index3"},
345-
new String[]{"doc"}, index -> {
345+
new String[]{"_doc"}, index -> {
346346
if (index.equals("index1")) {
347347
return field -> field.startsWith("name.") == false && field.startsWith("properties.key.") == false
348348
&& field.equals("age") == false && field.equals("address.location") == false;
@@ -362,7 +362,7 @@ public void testFindMappingsWithFilters() throws IOException {
362362
assertNotNull(index1Mappings);
363363

364364
assertEquals(1, index1Mappings.size());
365-
MappingMetaData docMapping = index1Mappings.get("doc");
365+
MappingMetaData docMapping = index1Mappings.get("_doc");
366366
assertNotNull(docMapping);
367367

368368
Map<String, Object> sourceAsMap = docMapping.getSourceAsMap();
@@ -406,13 +406,13 @@ public void testFindMappingsWithFilters() throws IOException {
406406
{
407407
ImmutableOpenMap<String, ImmutableOpenMap<String, MappingMetaData>> mappings = metaData.findMappings(
408408
new String[]{"index1", "index2" , "index3"},
409-
new String[]{"doc"}, index -> field -> (index.equals("index3") && field.endsWith("keyword")));
409+
new String[]{"_doc"}, index -> field -> (index.equals("index3") && field.endsWith("keyword")));
410410

411411
assertIndexMappingsNoFields(mappings, "index1");
412412
assertIndexMappingsNoFields(mappings, "index2");
413413
ImmutableOpenMap<String, MappingMetaData> index3 = mappings.get("index3");
414414
assertEquals(1, index3.size());
415-
MappingMetaData mappingMetaData = index3.get("doc");
415+
MappingMetaData mappingMetaData = index3.get("_doc");
416416
Map<String, Object> sourceAsMap = mappingMetaData.getSourceAsMap();
417417
assertEquals(3, sourceAsMap.size());
418418
assertTrue(sourceAsMap.containsKey("_routing"));
@@ -442,7 +442,7 @@ public void testFindMappingsWithFilters() throws IOException {
442442
{
443443
ImmutableOpenMap<String, ImmutableOpenMap<String, MappingMetaData>> mappings = metaData.findMappings(
444444
new String[]{"index1", "index2" , "index3"},
445-
new String[]{"doc"}, index -> field -> (index.equals("index2")));
445+
new String[]{"_doc"}, index -> field -> (index.equals("index2")));
446446

447447
assertIndexMappingsNoFields(mappings, "index1");
448448
assertIndexMappingsNoFields(mappings, "index3");
@@ -456,7 +456,7 @@ private static void assertIndexMappingsNoFields(ImmutableOpenMap<String, Immutab
456456
ImmutableOpenMap<String, MappingMetaData> indexMappings = mappings.get(index);
457457
assertNotNull(indexMappings);
458458
assertEquals(1, indexMappings.size());
459-
MappingMetaData docMapping = indexMappings.get("doc");
459+
MappingMetaData docMapping = indexMappings.get("_doc");
460460
assertNotNull(docMapping);
461461
Map<String, Object> sourceAsMap = docMapping.getSourceAsMap();
462462
assertEquals(3, sourceAsMap.size());
@@ -473,7 +473,7 @@ private static void assertIndexMappingsNotFiltered(ImmutableOpenMap<String, Immu
473473
assertNotNull(indexMappings);
474474

475475
assertEquals(1, indexMappings.size());
476-
MappingMetaData docMapping = indexMappings.get("doc");
476+
MappingMetaData docMapping = indexMappings.get("_doc");
477477
assertNotNull(docMapping);
478478

479479
Map<String, Object> sourceAsMap = docMapping.getSourceAsMap();
@@ -540,7 +540,7 @@ public static void assertMultiField(Map<String, Object> properties, String field
540540
}
541541

542542
private static final String FIND_MAPPINGS_TEST_ITEM = "{\n" +
543-
" \"doc\": {\n" +
543+
" \"_doc\": {\n" +
544544
" \"_routing\": {\n" +
545545
" \"required\":true\n" +
546546
" }," +

core/src/test/java/org/elasticsearch/discovery/ClusterDisruptionIT.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ public void testSearchWithRelocationAndSlowClusterStateProcessing() throws Excep
380380
final String node_2 = internalCluster().startDataOnlyNode();
381381
List<IndexRequestBuilder> indexRequestBuilderList = new ArrayList<>();
382382
for (int i = 0; i < 100; i++) {
383-
indexRequestBuilderList.add(client().prepareIndex().setIndex("test").setType("doc")
383+
indexRequestBuilderList.add(client().prepareIndex().setIndex("test").setType("_doc")
384384
.setSource("{\"int_field\":1}", XContentType.JSON));
385385
}
386386
indexRandom(true, indexRequestBuilderList);
@@ -398,7 +398,7 @@ public void testIndexImportedFromDataOnlyNodesIfMasterLostDataFolder() throws Ex
398398

399399
ensureStableCluster(2);
400400
assertAcked(prepareCreate("index").setSettings(Settings.builder().put("index.number_of_replicas", 0)));
401-
index("index", "doc", "1", jsonBuilder().startObject().field("text", "some text").endObject());
401+
index("index", "_doc", "1", jsonBuilder().startObject().field("text", "some text").endObject());
402402
ensureGreen();
403403

404404
internalCluster().restartNode(masterNode, new InternalTestCluster.RestartCallback() {
@@ -409,7 +409,7 @@ public boolean clearData(String nodeName) {
409409
});
410410

411411
ensureGreen("index");
412-
assertTrue(client().prepareGet("index", "doc", "1").get().isExists());
412+
assertTrue(client().prepareGet("index", "_doc", "1").get().isExists());
413413
}
414414

415415
/**

0 commit comments

Comments
 (0)