diff --git a/docs/reference/mapping/types/alias.asciidoc b/docs/reference/mapping/types/alias.asciidoc index d2b5ccdce8a..b4243d80e6d 100644 --- a/docs/reference/mapping/types/alias.asciidoc +++ b/docs/reference/mapping/types/alias.asciidoc @@ -74,7 +74,7 @@ field alias to query over multiple target fields in a single clause. ==== Unsupported APIs Writes to field aliases are not supported: attempting to use an alias in an index or update request -will result in a failure. Likewise, aliases cannot be used as the target of `copy_to`. +will result in a failure. Likewise, aliases cannot be used as the target of `copy_to` or in multi-fields. Because alias names are not present in the document source, aliases cannot be used when performing source filtering. For example, the following request will return an empty result for `_source`: diff --git a/server/src/main/java/org/elasticsearch/index/mapper/TypeParsers.java b/server/src/main/java/org/elasticsearch/index/mapper/TypeParsers.java index 52dfadfe273..a6a5fab0d04 100644 --- a/server/src/main/java/org/elasticsearch/index/mapper/TypeParsers.java +++ b/server/src/main/java/org/elasticsearch/index/mapper/TypeParsers.java @@ -230,7 +230,9 @@ public class TypeParsers { } else { throw new MapperParsingException("no type specified for property [" + multiFieldName + "]"); } - if (type.equals(ObjectMapper.CONTENT_TYPE) || type.equals(ObjectMapper.NESTED_CONTENT_TYPE)) { + if (type.equals(ObjectMapper.CONTENT_TYPE) + || type.equals(ObjectMapper.NESTED_CONTENT_TYPE) + || type.equals(FieldAliasMapper.CONTENT_TYPE)) { throw new MapperParsingException("Type [" + type + "] cannot be used in multi field"); } diff --git a/server/src/test/java/org/elasticsearch/index/mapper/DocumentMapperParserTests.java b/server/src/test/java/org/elasticsearch/index/mapper/DocumentMapperParserTests.java index 268b03d046c..8e164c86ebe 100644 --- a/server/src/test/java/org/elasticsearch/index/mapper/DocumentMapperParserTests.java +++ b/server/src/test/java/org/elasticsearch/index/mapper/DocumentMapperParserTests.java @@ -76,4 +76,28 @@ public class DocumentMapperParserTests extends ESSingleNodeTestCase { mapperParser.parse("type", new CompressedXContent(mapping))); assertTrue(e.getMessage(), e.getMessage().contains("mapper [foo] of different type")); } + + public void testMultiFieldsWithFieldAlias() throws Exception { + IndexService indexService = createIndex("test"); + DocumentMapperParser mapperParser = indexService.mapperService().documentMapperParser(); + String mapping = Strings.toString(XContentFactory.jsonBuilder().startObject().startObject("type") + .startObject("properties") + .startObject("field") + .field("type", "text") + .startObject("fields") + .startObject("alias") + .field("type", "alias") + .field("path", "other-field") + .endObject() + .endObject() + .endObject() + .startObject("other-field") + .field("type", "keyword") + .endObject() + .endObject() + .endObject().endObject()); + MapperParsingException e = expectThrows(MapperParsingException.class, () -> + mapperParser.parse("type", new CompressedXContent(mapping))); + assertEquals("Type [alias] cannot be used in multi field", e.getMessage()); + } }