美文网首页数据可视化
Elastic search mapping更新

Elastic search mapping更新

作者: 张培_ | 来源:发表于2020-04-15 20:51 被阅读0次

    以下内容针对ES 6以下的版本

    简介

    ES提供了PUT mapping API允许你可以:

    • 给已经存在的index加上一个新的type
    • 加上一个新的field给已经存在的type

    但是请注意,你不能使用这个API:

    • 修改某一个已经存在的字段的类型
      会出现conflic error
    {
        "type": "illegal_argument_exception",
        "reason": "Mapper for [XXX] conflicts with existing mapping in other types:\n[mapper [XXX] has different [analyzer]]"
    }
    

    这就说明你尝试修改一个已经存在的字段的类型,出现了冲突。

    • 删除某一个已经存在的字段

    你会发现永远无法删除成功,当你PUT mapping成功之后,然后再次调用GET mapping,你会发现你删除的字段依然存在。

    因此这个API所做的其实是创建 添加而并非修改

    例子

    创建

    我们使用PUT indexName作为创建指令:

    PUT indexName
    

    这个API的body中可以带很多内容作为初始化的setting。

    • 在一个已经存在/不存在的index test中创建新的type1以及type2,并且定义mapping
    PUT test
    {
        "mappings" : {
            "type1" : {
                "_all": {
                    enable: false
                },
                "properties" : {
                    "field1" : { "type" : "text" }
                }
            },
            "type2": {
                ...
            }
        }
    }
    

    请注意,这个指令是用来创建的,因此前提条件是:

    • index可以存在或者不存在
    • 被定义mapping的type必须不存在

    否则就会报错说test index already exists

    添加新的field

    我们使用 PUT {indexName}/_mapping/{type}这个API作为添加的API,千万不要使用上面那个创建的API,因为有可能出现exists error

    PUT twitter/_mapping/user 
    {
      "properties": {
        "name": {
          "type": "text"
        }
      }
    }
    
    
    • 注意

    body中通常都只有"properties" section,如果你想要加入其他的meta field,有可能会报错, 如下就会报错

    PUT twitter/_mapping/user 
    {
      "_all": {
        "enable": false
      },
      "_parent": {
        ...
      },
      "properties": {
        "name": {
          "type": "text"
        }
      }
    }
    
    

    如何put那些有meta field的mapping?

    比如上面的mapping中包含_all_parent等meta field,每次直接put就会说_all无法识别。

    那么将body改成这样就可以PUT成功

    PUT twitter/_mapping/user 
    {
      "user": {
          "_all": {
            "enable": false
          },
          "_parent": {
            ...
          },
          "properties": {
            "name": {
              "type": "text"
            }
          }
      }
    }
    
    

    使用type name将所有的内容都包在一起

    相关文章

      网友评论

        本文标题:Elastic search mapping更新

        本文链接:https://www.haomeiwen.com/subject/zqghvhtx.html