删除所有记录中的字段及其内容,并使用新映射重新创建它

时间:2013-01-29 07:34:44

标签: lucene elasticsearch

我有一个字段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}

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

由于

1 个答案:

答案 0 :(得分:1)

AFAIK,您无法删除单个字段并重新创建它。 你既不能修改映射,也不能自动重构索引。想象一下,你不存储_source。在索引数据之前,Elasticsearch如何知道您的数据是什么样的?

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

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

  • 再次发送所有文档(它会更新所有内容) - 又名reindex(您可以使用扫描和滚动API来获取旧文档)
  • 尝试使用Update API
  • 更新您的文档

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

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

但是,正如您所看到的,您必须逐个文档运行它,我认为使用Bulk API重新编制索引需要更多的时间。

有帮助吗?