Elasticsearch默认映射

时间:2014-02-04 05:20:33

标签: mapping elasticsearch

我目前的理解 -

  1. Elasticsearch在第一次收到JSON数据集时创建映射索引。
  2. 无法更改此映射,但可以重新映射数据集。
  3. 问题 -

    忘记重新映射。是否有任何方法可以告诉ES默认 作为 -

    "Consider everything that is not a date to be of string type"

    另外,如果我这样做,我会失去很多吗?

    更新 -

    我添加了文件 - config/mappings/_default/mapping.json,其中包含以下内容 -

    {
        "dynamic_templates": [
            {
                "template_1": {
                    "match": "*",
                    "match_mapping_type": "int",
                    "mapping": {
                        "type": "string"
                    }
                },
                "template_2": {
                    "match": "*",
                    "match_mapping_type": "long",
                    "mapping": {
                        "type": "string"
                    }
                }
            }
        ]
    }
    

    我还尝试将以下内容放在 - config/default_mapping.json

    {
        "_default_" : {
            "match": "*",
            "match_mapping_type": "int",
            "mapping": {
                    "type": "string"
            }
        }
    }
    

    我的“动机”是摆脱intlong类型更改为string时出现的错误。这会将所有 intlong值映射到将来创建的所有索引中的string吗?我是否需要将此dynamic_templates密钥嵌套在_all

    更新II -

    添加此映射文件会导致elasticsearch咳嗽 -

    [2014-02-04 10:48:34,396][DEBUG][action.admin.indices.create] [Her] [logstash-2014.02.04] failed to create
    org.elasticsearch.index.mapper.MapperParsingException: mapping [mapping.json]
        at org.elasticsearch.cluster.metadata.MetaDataCreateIndexService$2.execute(MetaDataCreateIndexService.java:312)
        at org.elasticsearch.cluster.service.InternalClusterService$UpdateTask.run(InternalClusterService.java:298)
        at org.elasticsearch.common.util.concurrent.PrioritizedEsThreadPoolExecutor$TieBreakingPrioritizedRunnable.run(PrioritizedEsThreadPoolExecutor.java:135)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
        at java.lang.Thread.run(Thread.java:701)
    Caused by: java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map
        at org.elasticsearch.index.mapper.DocumentMapperParser.extractMapping(DocumentMapperParser.java:268)
        at org.elasticsearch.index.mapper.DocumentMapperParser.parse(DocumentMapperParser.java:155)
        at org.elasticsearch.index.mapper.MapperService.parse(MapperService.java:314)
        at org.elasticsearch.index.mapper.MapperService.merge(MapperService.java:193)
        at org.elasticsearch.cluster.metadata.MetaDataCreateIndexService$2.execute(MetaDataCreateIndexService.java:309)
        ... 5 more
    2014-02-04 10:48:34 +0000 [warn]: temporarily failed to flush the buffer. next_retry=2014-02-04 10:48:33 +0000 error_class="Net::HTTPServerException" error="400 \"Bad Request\"" instance=17509700
    

1 个答案:

答案 0 :(得分:7)

当你从头开始,因此没有映射时,你依赖于默认值。每次发送文档时,尚未映射的字段将根据其json类型(以及日期约定)自动映射。也就是说,如果您将第一个文档中的字段作为数字发送,并且该字段在第二个文档中成为字符串,则第二个文档的索引操作将返回错误。

有管理映射的api,这并不意味着您必须声明所有字段。您只需指定要与默认行为不同的行为。您可以在creating an index时指定映射,如果索引已经存在,则使用put mapping api,或者甚至可以在index templates中包含映射,以用于尚未创建的索引。

可以更改映射,但只能应用向后兼容的更改。您始终可以添加新字段,但无法更改现有字段的类型或分析器。在这种情况下你可以做的是尝试使用multi-fields使更改向后兼容,否则你需要重新索引更新的映射。

至于你的上一个问题,如果你把所有东西都作为一个字符串索引,你会失去你通常用数字做的事情,例如范围查询。这是否可行取决于您的数据以及您需要做什么。