Ensure that field aliases cannot be used in multi-fields. (#32219)

This commit is contained in:
Julie Tibshirani 2018-07-20 00:18:54 -07:00 committed by GitHub
parent 24068a773d
commit 0f0068b91c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 28 additions and 2 deletions

View File

@ -74,7 +74,7 @@ field alias to query over multiple target fields in a single clause.
==== Unsupported APIs ==== Unsupported APIs
Writes to field aliases are not supported: attempting to use an alias in an index or update request 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 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`: source filtering. For example, the following request will return an empty result for `_source`:

View File

@ -230,7 +230,9 @@ public class TypeParsers {
} else { } else {
throw new MapperParsingException("no type specified for property [" + multiFieldName + "]"); 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"); throw new MapperParsingException("Type [" + type + "] cannot be used in multi field");
} }

View File

@ -76,4 +76,28 @@ public class DocumentMapperParserTests extends ESSingleNodeTestCase {
mapperParser.parse("type", new CompressedXContent(mapping))); mapperParser.parse("type", new CompressedXContent(mapping)));
assertTrue(e.getMessage(), e.getMessage().contains("mapper [foo] of different type")); 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());
}
} }