Elasticsearch默认映射

 Stupid锋_891 发布于 2023-01-29 15:36

我目前的理解 -

    Elasticsearch在第一次接收JSON数据集时创建映射索引.

    无法更改此映射,但可以重新映射数据集.

题-

忘记重新映射.有没有办法告诉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.这将映射所有 intlongstring以及将来创建的所有索引吗?我需要将此dynamic_templates密钥嵌入其中_all吗?

更新II-

添加此映射文件会导致弹性搜索咳嗽 -

[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

javanna.. 7

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

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

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

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

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

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

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

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

    2023-01-29 15:40 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有