什么情况下需要更改ES索引?

在使用ES做项目开发的时候,很多时候回随着版本的迭代出现ES索引数据的变动,如果是在刚开始开发的时候,那就是删除原来的旧数据重新建索引就可以了,但是项目上线并运营了一段时间后,很显然这种方式就不可取了。

这时候我们就要用到ES提供的_reindex方法了

假设ES已经创建了名叫live的索引,并且在ES里面live已经存入了很多数据。
mapping结构体为:

{
  "mappings": {
    "properties": {
      "room_id": {
        "type": "keyword"
      },
      "room_name": {
        "type": "text"
      },
      "shop_ids": {
        "type": "keyword"
      },
      "live_date": {
        "type": "keyword"
      },
      "goods_list": {
        "type": "nested",
        "properties": {
          "goods_id": {
            "type": "keyword"
          },
          "goods_name": {
            "type": "text"
          },
          "sku_code": {
            "type": "keyword"
          },
          "category_id": {
            "type": "keyword"
          },
          "activity_type": {
            "type": "keyword"
          },
          "lecture_type": {
            "type": "keyword"
          },
          "area_ids": {
            "type": "keyword"
          }
        }
      },
      "creator_id": {
        "type": "keyword"
      },
      "push_type": {
        "type": "keyword"
      },
      "create_at": {
        "type": "keyword"
      }
    }
  }
}

索引重建以及数据迁移

假设一个场景,需要更改live对应的mapping结构体,去掉"push_type"字典,另外新增"push_status"字典,但是不影响原来数据。

1.创建一个新的索引,索引名称为datacube_live,索引对应mapping结构体如下所示,通过调用ES接口,创建新索引。

PUT http://xxxx:9200/datacube_live

{
  "mappings": {
    "properties": {
      "room_id": {
        "type": "keyword"
      },
      "room_name": {
        "type": "text"
      },
      "shop_ids": {
        "type": "keyword"
      },
      "live_date": {
        "type": "keyword"
      },
      "goods_list": {
        "type": "nested",
        "properties": {
          "goods_id": {
            "type": "keyword"
          },
          "goods_name": {
            "type": "text"
          },
          "sku_code": {
            "type": "keyword"
          },
          "category_id": {
            "type": "keyword"
          },
          "activity_type": {
            "type": "keyword"
          },
          "lecture_type": {
            "type": "keyword"
          },
          "area_ids": {
            "type": "keyword"
          }
        }
      },
      "creator_id": {
        "type": "keyword"
      },
      "push_status": {
        "type": "keyword"
      },
      "create_at": {
        "type": "keyword"
      }
    }
  }
}

2.将ES里面live对应的数据,复制到datacube_live索引里面。

POST http://localhost:9200/_reindex

{
  "source": {
    "index": "live"
  },
  "dest": {
    "index": "datacube_live"
  }
}

3.检验迁移是否成功

GET

http://xxxx:9200/datacube_live/_search

请求参数为:
{}

image.png

datacube_live已经包含了数据,说明数据迁移成功。可以先删除live索引及数据,再来一次反向操作,再更改为live,这就完成了整个数据迁移。


杨帆
28 声望3 粉丝