[ https://issues.apache.org/jira/browse/CALCITE-6498?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Tim Grein updated CALCITE-6498: ------------------------------- Description: _EmbeddedElasticsearchPolicy#_ _applyMapping_ tries to apply a multi-field mapping by adding another _properties_ field inside a parent field mapping. In Elasticsearch you need to use _fields_ rather than _properties_ for a multi-field mapping to work. I've tested this with ES 7 and ES 6 (only including ES 7 example here in the issue description; for ES 6 you need to wrap everything under "mappings" in "_doc"): ES 7: {code:java} PUT /some_index { "mappings": { "properties": { "some_field": { "type": "text", "properties": { "keyword": { "type": "keyword" } } } } } }{code} will lead to the following error: {code:java} { "error" : { "root_cause" : [ { "type" : "mapper_parsing_exception", "reason" : "Mapping definition for [some_field] has unsupported parameters: [properties : {keyword={type=keyword}}]" } ], "type" : "mapper_parsing_exception", "reason" : "Failed to parse mapping [_doc]: Mapping definition for [some_field] has unsupported parameters: [properties : {keyword={type=keyword}}]", "caused_by" : { "type" : "mapper_parsing_exception", "reason" : "Mapping definition for [some_field] has unsupported parameters: [properties : {keyword={type=keyword}}]" } }, "status" : 400 } {code} Successful request: {code:java} PUT /some_index { "mappings": { "properties": { "some_field": { "type": "text", "fields": { "keyword": { "type": "keyword" } } } } } } {code} You'll encounter this error also, if you adapt the test data in _ElasticsearchAdapterTest_ to include nested fields: {code:java} @BeforeAll public static void setupInstance() throws Exception { // "city.keyword" is a nested field with type "keyword" final Map<String, String> mapping = ImmutableMap.of("city", "text", "city.keyword", "keyword", "state", "keyword", "pop", "long"); {code} Error: {code:java} {... {"type":"mapper_parsing_exception","reason":"unknown parameter [properties] on mapper [city] of type [text]"} ...} {code} Looking at _ElasticsearchJson#visitMappingProperties_ I assume this will lead to a similar issue, which I'll double-check (we probably need to distinguish between nested fields and multi-field mappings explicitly). This is related to https://issues.apache.org/jira/browse/CALCITE-3027 as you want to detect, if you perform a "LIKE" operator on a purely "text" mapped field, which will lead to weird semantics ("text" mapped fields are analyzed/broken up into several tokens), if you do not prevent it. Usually you have a multi-field mapping for a field containing text ("text" mapping for full text search and a "keyword" mapping you can use for aggregations, wildcard queries etc.). So this is rather important to work correctly overall and in the tests. was: _EmbeddedElasticsearchPolicy#_ _applyMapping_ tries to apply a multi-field mapping by adding another _properties_ field inside a parent field mapping. In Elasticsearch you need to use _fields_ rather than _properties_ for a multi-field mapping to work. I've tested this with ES 7 and ES 6 (only including ES 7 example here in the issue description; for ES 6 you need to wrap everything under "mappings" in "_doc"): ES 7: {code:java} PUT /some_index { "mappings": { "properties": { "some_field": { "type": "text", "properties": { "keyword": { "type": "keyword" } } } } } }{code} will lead to the following error: {code:java} { "error" : { "root_cause" : [ { "type" : "mapper_parsing_exception", "reason" : "Mapping definition for [some_field] has unsupported parameters: [properties : {keyword={type=keyword}}]" } ], "type" : "mapper_parsing_exception", "reason" : "Failed to parse mapping [_doc]: Mapping definition for [some_field] has unsupported parameters: [properties : {keyword={type=keyword}}]", "caused_by" : { "type" : "mapper_parsing_exception", "reason" : "Mapping definition for [some_field] has unsupported parameters: [properties : {keyword={type=keyword}}]" } }, "status" : 400 } {code} Successful request: {code:java} PUT /some_index { "mappings": { "properties": { "some_field": { "type": "text", "fields": { "keyword": { "type": "keyword" } } } } } } {code} You'll encounter this error also, if you adapt the test data in _ElasticsearchAdapterTest_ to include nested fields: {code:java} @BeforeAll public static void setupInstance() throws Exception { // "city.keyword" is a nested field with type "keyword" final Map<String, String> mapping = ImmutableMap.of("city", "text", "city.keyword", "keyword", "state", "keyword", "pop", "long"); {code} Error: {code:java} {... {"type":"mapper_parsing_exception","reason":"unknown parameter [properties] on mapper [city] of type [text]"} ...} {code} Looking at _ElasticsearchJson#visitMappingProperties_ I assume this will lead to a similar issue, which I'll double-check (we probably need to distinguish between nested fields and multi-field mappings explicitly). This is related to https://issues.apache.org/jira/browse/CALCITE-3027 as you want to detect, if you perform a "LIKE" operator on a purely "text" mapped field, which will lead to weird semantics ("text" mapped fields are analyzed/broken up into several tokens), if you do not prevent it. Usually you have a multi-field mapping for a field containing text ("text" field mapping and a "keyword" mapping you can use for aggregations, wildcard queries etc.). So this is rather important to work correctly overall and in the tests. > Elasticsearch multi-field mappings do not work > ---------------------------------------------- > > Key: CALCITE-6498 > URL: https://issues.apache.org/jira/browse/CALCITE-6498 > Project: Calcite > Issue Type: Bug > Components: elasticsearch-adapter > Reporter: Tim Grein > Assignee: Tim Grein > Priority: Major > Fix For: 1.38.0 > > > _EmbeddedElasticsearchPolicy#_ > _applyMapping_ tries to apply a multi-field mapping by adding another > _properties_ field inside a parent field mapping. In Elasticsearch you need > to use _fields_ rather than _properties_ for a multi-field mapping to work. > > I've tested this with ES 7 and ES 6 (only including ES 7 example here in the > issue description; for ES 6 you need to wrap everything under "mappings" in > "_doc"): > ES 7: > {code:java} > PUT /some_index > { > "mappings": { > "properties": { > "some_field": { > "type": "text", > "properties": { > "keyword": { > "type": "keyword" > } > } > } > } > } > }{code} > will lead to the following error: > {code:java} > { > "error" : { > "root_cause" : [ > { > "type" : "mapper_parsing_exception", > "reason" : "Mapping definition for [some_field] has unsupported > parameters: [properties : {keyword={type=keyword}}]" > } > ], > "type" : "mapper_parsing_exception", > "reason" : "Failed to parse mapping [_doc]: Mapping definition for > [some_field] has unsupported parameters: [properties : > {keyword={type=keyword}}]", > "caused_by" : { > "type" : "mapper_parsing_exception", > "reason" : "Mapping definition for [some_field] has unsupported > parameters: [properties : {keyword={type=keyword}}]" > } > }, > "status" : 400 > } {code} > > Successful request: > {code:java} > PUT /some_index > { > "mappings": { > "properties": { > "some_field": { > "type": "text", > "fields": { > "keyword": { > "type": "keyword" > } > } > } > } > } > } {code} > You'll encounter this error also, if you adapt the test data in > _ElasticsearchAdapterTest_ to include nested fields: > {code:java} > @BeforeAll > public static void setupInstance() throws Exception { > // "city.keyword" is a nested field with type "keyword" > final Map<String, String> mapping = > ImmutableMap.of("city", "text", "city.keyword", "keyword", "state", > "keyword", "pop", "long"); {code} > Error: > {code:java} > {... > {"type":"mapper_parsing_exception","reason":"unknown parameter [properties] > on mapper [city] of type [text]"} > ...} {code} > Looking at _ElasticsearchJson#visitMappingProperties_ I assume this will lead > to a similar issue, which I'll double-check (we probably need to distinguish > between nested fields and multi-field mappings explicitly). > This is related to https://issues.apache.org/jira/browse/CALCITE-3027 as you > want to detect, if you perform a "LIKE" operator on a purely "text" mapped > field, which will lead to weird semantics ("text" mapped fields are > analyzed/broken up into several tokens), if you do not prevent it. Usually > you have a multi-field mapping for a field containing text ("text" mapping > for full text search and a "keyword" mapping you can use for aggregations, > wildcard queries etc.). So this is rather important to work correctly overall > and in the tests. -- This message was sent by Atlassian Jira (v8.20.10#820010)