0

field10当我更新索引中的特定记录时,我有一个意外创建的字段。我想从我的索引中删除该字段及其所有内容并使用以下映射重新创建它:

"mytype":{
  "properties":{
    "field10":{ 
      "type":"string",
      "index":"not_analyzed",
      "include_in_all":"false",
      "null_value":"null"      
    }  
  }  
}

当我尝试使用 Put Mapping API 创建此映射时,出现错误:{"error":"MergeMappingException[Merge failed with failures {[mapper [field10] has different index values, mapper [field10] has different index_analyzer, mapper [field10] has different search_analyzer]}]","status":400}.

如何更改此字段的映射?我不想仅仅为了这个小事故重新索引数百万条记录。

谢谢

4

1 回答 1

1

AFAIK,您不能删除单个字段并重新创建它。您不能只修改映射并自动重新索引所有内容。想象一下,您不存储_source. Elasticsearch 如何知道您的数据在被索引之前的样子?

但是,您可以field10.field10使用旧映射和field10.new新分析器使用多字段修改映射。

如果您不重新索引,则只有新文档的内容才会在field10.new. 如果要管理旧文档,则必须:

  • 再次发送您的所有文档(它将更新所有内容) - 也就是重新索引(您可以使用扫描和滚动 API 来获取您的旧文档)
  • 尝试使用更新 API更新您的文档

您可能可以尝试运行如下查询:

curl -XPOST localhost:9200/crunchbase/person/1/_update -d '{
    "script" : "ctx._source.field10 = ctx._source.field10"
}'

但是,如您所见,您必须逐个文档地运行它,我认为这比使用 Bulk API 重新索引所有内容要花费更多时间。

它有帮助吗?

于 2013-01-29T08:10:19.657 回答