ElasticSearch更新多字段映射

时间:2014-12-17 14:02:51

标签: elasticsearch elasticsearch-mapping

我有一个字段的现有映射,我想将其更改为多字段。

现有的映射是

{
   "my_index": {
      "mappings": {
         "my_type": {
            "properties": {
               "author": {
                  "type": "string"
               },
               "isbn": {
                  "type": "string",
                  "analyzer": "standard",
                  "fields": {
                     "ngram": {
                        "type": "string",
                        "search_analyzer": "keyword"
                     }
                  }
               },
               "title": {
                  "type": "string",
                  "analyzer": "english",
                  "fields": {
                     "std": {
                        "type": "string",
                        "analyzer": "standard"
                     }
                  }
               }
            }
         }
      }
   }
}

根据documentation,我应该可以更改" author"执行以下

到多字段
PUT /my_index
{
  "mappings": {
        "my_type": {
            "properties": {
                "author": 
                { 
                    "type": "multi-field",
                    "fields": {
                        "ngram": {
                          "type": "string",
                          "indexanalyzer": "ngram_analyzer",
                          "search_analyzer": "keyword"
                        },
                         "name" : {
                         "type": "string"
                        }
                    }
                }              
            }
        }
    }
}

但我得到以下错误:

{
"error": "IndexAlreadyExistsException[[my_index] already exists]",
"status": 400
}

我错过了一些非常明显的东西吗?

3 个答案:

答案 0 :(得分:1)

而不是PUT到/ my_index执行:

POST /my_index/_mapping

答案 1 :(得分:1)

您无法更改现有索引中的字段类型。 如果您无法重新创建索引,则可以使用复制到字段来实现类似的功能。

   PUT /my_index
        {
          "mappings": {
           "my_type": {
        "properties": {
                   "author": 
                   { 
                      "type": "string",
                      "copy_to": ["author-name","author-ngram"]
                   }

                    "author-ngram": {
                      "type": "string",
                      "indexanalyzer": "ngram_analyzer",
                      "search_analyzer": "keyword"
                    },
                     "author-name" : {
                     "type": "string"
                    }

            }              
          }
       }
     }
  }

答案 2 :(得分:1)

虽然我没有在您的特定示例中尝试过,但确实可以通过先关闭索引然后应用映射来更新字段映射。

示例:

POST /my_index/_close
POST /my_index/_mapping
{
     "my_field:{"new_mapping"}
}
POST /my_index/_open

我已通过向映射字段添加“copy_to”映射属性对其进行了测试。

基于https://gist.github.com/nicolashery/6317643