数据可视化

Elastic search mapping更新

2020-04-15  本文已影响0人  张培_

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

简介

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

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

{
    "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。

PUT test
{
    "mappings" : {
        "type1" : {
            "_all": {
                enable: false
            },
            "properties" : {
                "field1" : { "type" : "text" }
            }
        },
        "type2": {
            ...
        }
    }
}

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

否则就会报错说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将所有的内容都包在一起

上一篇下一篇

猜你喜欢

热点阅读