在Elasticsearch中将索引的字段类型更改为新索引

时间:2018-01-16 22:38:01

标签: elasticsearch

假设我有索引,其映射看起来像这样:

curl -XPUT 'http://localhost:9200/oldindex/_mapping/book' -d '
   {
    "book" : {
        "properties" : {
            "title" : {"type" : "text"},
            "words" : {"type" : "text"},
            "pages": {"type": "int"}
        }
     }
   }'

我想从旧索引创建一个新索引,但现在我想要"单词"键入字段为"关键字"而不是"文字":

curl -XPUT 'http://localhost:9200/oldindex/_mapping/book' -d '
       {
        "book" : {
            "properties" : {
                "title" : {"type" : "text"},
                "words" : {"type" : "keyword"},
                "pages": {"type": "int"}
            }
         }
       }'

我该怎么做?我可以使用" Reindex API"还是有更好的解决方案?

1 个答案:

答案 0 :(得分:1)

假设您不希望在索引上使用其他字段wordsKeyword,则Reindex API可能是最佳的。将数据移动到临时索引,核对索引并重新创建它(使用更新的映射),然后将临时索引数据重新索引回新索引。
这是一步一步:

  1. 使用新映射创建新索引。
  2. 通过_reindex将旧索引中的数据复制到新索引。
  3. 删除旧索引。
  4. 使用新映射重新创建旧索引。
  5. 通过_reindex将数据从新索引复制到旧索引。
  6. 删除新索引。 - “旧索引”(技术上是一个具有相同名称的新索引)现在将具有更新的映射和数据。总共五个API调用(两个_reindexes将数据移动到新映射,然后将其移回)
  7. 如果您不介意使用其他字段并且不想重新编制索引,则可以考虑使用_update_by_query API将值通过字面复制到新映射的keyword字段中脚本,从而弃用text