Elasticsearch: 支持强制 JSON -> String

创建于 2016-07-29  ·  3评论  ·  资料来源: elastic/elasticsearch

继续对话从这里开始: 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。

:SearcMapping >enhancement

最有用的评论

我不喜欢这个功能。 要么我们可以让字符串字段自动将对象强制转换为字符串,但在我看来,这会很棘手:我当然可以想象用户抱怨 elasticsearch 不会拒绝不符合映射的文档。 或者我们需要一个映射选项来启用这种行为,就像数字必须自动解析字符串一样,但我也不喜欢它,因为我们已经有太多关于映射的选项。 我宁愿依靠客户端提供一个包含转义 json 的字符串。

所有3条评论

现在,上面的映射不被认为是有效的。 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的副本,我们决定不这样做。

此页面是否有帮助?
0 / 5 - 0 等级