继续对话从这里开始: https :
问题描述,包括预期行为与实际行为:
考虑到以下映射,希望能够将对象字段视为字符串:
"properties": {
"severity": {
"index": "not_analyzed",
"type": "string"
},
"metadata": {
"type": "string"
"coerce": true
}
}
索引以下文档:
{
"severity": "ERROR",
"metadata": {
"someKey": "someValue",
"someKey": {
"some nested key": "some nested value"
}
}
}
应该将文档存储在metadata
作为可搜索的字符串。
现在,不可能将任何内容强制转换为 String。
现在,上面的映射不被认为是有效的。 ES 爆发:
MapperParsingException[Failed to parse mapping [event]: Mapping definition for [metadata] has unsupported parameters: [coerce : true]]; nested: MapperParsingException[Mapping definition for [metadata] has unsupported parameters: [coerce : true]];
at org.elasticsearch.cluster.metadata.MetaDataCreateIndexService$1.execute(MetaDataCreateIndexService.java:332)
at org.elasticsearch.cluster.ClusterStateUpdateTask.execute(ClusterStateUpdateTask.java:45)
at org.elasticsearch.cluster.service.InternalClusterService.runTasksForExecutor(InternalClusterService.java:468)
at org.elasticsearch.cluster.service.InternalClusterService$UpdateTask.run(InternalClusterService.java:772)
at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.runAndClean(PrioritizedEsThreadPoolExecutor.java:231)
at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.run(PrioritizedEsThreadPoolExecutor.java:194)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:744)
Caused by: MapperParsingException[Mapping definition for [metadata] has unsupported parameters: [coerce : true]]
at org.elasticsearch.index.mapper.DocumentMapperParser.checkNoRemainingFields(DocumentMapperParser.java:171)
at org.elasticsearch.index.mapper.DocumentMapperParser.checkNoRemainingFields(DocumentMapperParser.java:165)
at org.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parseProperties(ObjectMapper.java:307)
at org.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parseObjectOrDocumentTypeProperties(ObjectMapper.java:218)
at org.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parse(ObjectMapper.java:193)
at org.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parseProperties(ObjectMapper.java:305)
at org.elasticsearch.index.mapper.object.ObjectMapper$TypeParser.parseObjectOrDocumentTypeProperties(ObjectMapper.java:218)
at org.elasticsearch.index.mapper.object.RootObjectMapper$TypeParser.parse(RootObjectMapper.java:139)
at org.elasticsearch.index.mapper.DocumentMapperParser.parse(DocumentMapperParser.java:118)
at org.elasticsearch.index.mapper.DocumentMapperParser.parse(DocumentMapperParser.java:99)
at org.elasticsearch.index.mapper.MapperService.parse(MapperService.java:498)
at org.elasticsearch.index.mapper.MapperService.merge(MapperService.java:288)
at org.elasticsearch.cluster.metadata.MetaDataCreateIndexService$1.execute(MetaDataCreateIndexService.java:329)
我不喜欢这个功能。 要么我们可以让字符串字段自动将对象强制转换为字符串,但在我看来,这会很棘手:我当然可以想象用户抱怨 elasticsearch 不会拒绝不符合映射的文档。 或者我们需要一个映射选项来启用这种行为,就像数字必须自动解析字符串一样,但我也不喜欢它,因为我们已经有太多关于映射的选项。 我宁愿依靠客户端提供一个包含转义 json 的字符串。
这是https://github.com/elastic/elasticsearch/issues/17918的副本,我们决定不这样做。
最有用的评论
我不喜欢这个功能。 要么我们可以让字符串字段自动将对象强制转换为字符串,但在我看来,这会很棘手:我当然可以想象用户抱怨 elasticsearch 不会拒绝不符合映射的文档。 或者我们需要一个映射选项来启用这种行为,就像数字必须自动解析字符串一样,但我也不喜欢它,因为我们已经有太多关于映射的选项。 我宁愿依靠客户端提供一个包含转义 json 的字符串。