Elasticsearch: Suporte para coerce JSON -> String

Criado em 29 jul. 2016  ·  3Comentários  ·  Fonte: elastic/elasticsearch

A continuação da conversa começou aqui: https://discuss.elastic.co/t/coerce-object-to-string/56748/3

Descrição do problema, incluindo comportamento esperado versus comportamento real :

Gostaria de poder tratar um campo de objeto como String, dado o seguinte mapeamento:

          "properties": {
            "severity": {
              "index": "not_analyzed",
              "type": "string"
            },
            "metadata": {
              "type": "string"
              "coerce": true
            }
          }

Indexando o seguinte documento:

{
    "severity": "ERROR",
    "metadata": {
        "someKey": "someValue",
        "someKey": {
            "some nested key": "some nested value"
        } 
    }
}

deve armazenar o documento em metadata como uma string pesquisável.

No momento, não é possível forçar nada a uma String.

:SearcMapping >enhancement

Comentários muito úteis

Eu não sou fã desse recurso. Ou poderíamos fazer campos de string automaticamente coagir objetos a strings, mas isso seria uma armadilha na minha opinião: eu posso certamente imaginar usuários reclamando que elasticsearch não rejeita documentos que não estão em conformidade com os mapeamentos. Ou precisaríamos de uma opção de mapeamento para habilitar esse comportamento, como os números têm que analisar strings automaticamente, mas eu também não gosto porque já temos muitas opções de mapeamentos. Prefiro confiar nos clientes para fornecer uma string que contenha json de escape.

Todos 3 comentários

No momento, esse mapeamento acima não é considerado válido. ES explode com:

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)

Eu não sou fã desse recurso. Ou poderíamos fazer campos de string automaticamente coagir objetos a strings, mas isso seria uma armadilha na minha opinião: eu posso certamente imaginar usuários reclamando que elasticsearch não rejeita documentos que não estão em conformidade com os mapeamentos. Ou precisaríamos de uma opção de mapeamento para habilitar esse comportamento, como os números têm que analisar strings automaticamente, mas eu também não gosto porque já temos muitas opções de mapeamentos. Prefiro confiar nos clientes para fornecer uma string que contenha json de escape.

Esta é uma duplicata de https://github.com/elastic/elasticsearch/issues/17918 onde decidimos não fazê-lo.

Esta página foi útil?
0 / 5 - 0 avaliações