弹性搜索 - 重命名类型

时间:2016-04-14 20:51:23

标签: php elasticsearch indexing

我遇到了在弹性搜索中仅重新索引部分索引数据的问题。

使用PHP弹性搜索客户端。

我们假设我的索引myindex的类型为type1type2

现在type2中的一些字段发生了变化,我需要更改映射。

在阅读完他们的文档之后,我认为我可以通过创建新类型并创建别名来逃避,但遗憾的是,您似乎不能拥有类型的别名,它只适用于索引。

然后,我想为newtype2创建一个新的临时映射,将数据从type2复制到newtype2并删除type2

但现在我找不到任何重命名类型的方法。

3 个答案:

答案 0 :(得分:2)

不,您无法重命名某种类型。

阅读这篇文章: https://www.elastic.co/blog/changing-mapping-with-zero-downtime

答案 1 :(得分:1)

我想延长 marcostvz's answer

如果您确实希望现有索引具有类型名称,即使不能直接完成,也可以借助其他索引和重新索引来完成。

  1. 创建临时索引。
  2. 将旧类型的原始索引复制到新类型的临时索引。
  3. 重新创建(删除并放置)原始索引。
  4. 将临时索引复制到原始索引。
  5. 删除临时索引。

在运行代码时,我遇到了数据在此过程中丢失的问题。在命令之间添加一点中断(准确地说是 sleep 5)解决了问题。

curl -XPUT localhost:9200/index_tmp &&
curl -XPOST localhost:9200/_reindex -H 'Content-Type: application/json' -d '
{
  "source": {
    "index": "index",
    "type": "OldType"
  },
  "dest": {
    "index": "index_tmp",
    "type": "NewType"
  }
}' &&
curl -XDELETE localhost:9200/index &&
curl -XPUT localhost:9200/index &&
curl -XPOST localhost:9200/_reindex -H 'Content-Type: application/json' -d '
{
  "source": {
    "index": "index_tmp"
  },
  "dest": {
    "index": "index"
  }
}' &&
curl -XDELETE localhost:9200/index_tmp

答案 2 :(得分:0)

重命名类型的最接近方法是使用新索引(具有新类型):

  • 创建新索引(使用新类型,我正在使用模板)
  • 使用新类型重新索引
  • 删除旧索引
  • 创建别名(以便用作旧命名)

将flb_type重命名为_doc的示例:

    export INDEX=log-2019.03.12 &&
    curl -XPUT localhost:9200/$INDEX-v2 &&
    curl -XPOST localhost:9200/_reindex -H 'Content-Type: application/json' -d '
    {
      "source": {
        "index": "'$INDEX'",
        "type": "flb_type"
      },
      "dest": {
        "index": "'$INDEX'-v2",
        "type": "_doc"
      }
    }' &&
    curl -XDELETE localhost:9200/$INDEX &&
    curl -XPOST localhost:9200/_aliases -H 'Content-Type: application/json' -d '
    {
      "actions": [
        {
          "add":
          {
            "alias": "'$INDEX'",
            "index": "'$INDEX'-v2"
          }
        }
      ]
    }'