7.elasticsearch重建索引

发布时间 2024-01-05 10:41:10作者: 赛博朋克V

什么时候需要重建索引

  • 索引的mappings发生变更
  • 索引的setting发生变更
  • 集群内,集群间,需要做数据迁移

update by query

在现有索引重建

比如需要给一个text新增一个子字段,用english分词器。那么新添加的数据会被索引,之前的数据不会被索引。此时可以用_update_by_query

POST blogs/_update_by_query
{

}

reindex

新建一个索引,然后使用reindex导入原有索引数据

POST  _reindex
{
  "source": {
    "index": "blogs"
  },
  "dest": {
    "index": "blogs_fix",
    "version_type": "internal"
  }
}

URI上添加wait_for_completion=false实现异步操作

POST  _reindex?wait_for_completion=false
{
  "source": {
    "index": "blogs"
  },
  "dest": {
    "index": "blogs_fix",
    "version_type": "internal"
  }
}

#查看进度
GET _tasks?detailed=true&actions=*reindex

什么是alias

alias是别名对意思,对一个索引建立别名

  • 可以帮助运维实现零停机情况下重建索引
  • 可以过滤一些索引的数据
  • 可以指向多个索引(只能查,不能修改新增等操作)
PUT /my_index_name/_alias/alias_name

POST /_aliases
{
    "actions": [
        { "add":    { "index": "my_index__name_v2", "alias": "alias_name" }}
    ]
}

如何实现零停机呢更换索引呢

  • 首先保证要重建的索引是有别名的,并且其他业务方是使用这个alias来获取数据的
  • 新建一个索引,将老索引的数据添加到新增的索引上
POST _reindex
{
  "source": {
    "index": "old_index"
  },
  "dest": {
    "index": "new_index"
  }
}
  • 把老索引的别名删除,再给新增的索引添加老索引的别名
POST /_aliases
{
    "actions": [
        { "remove": { "index": "my_index_name_v1", "alias": "alias_name" }},
        { "add":    { "index": "my_index__name_v2", "alias": "alias_name" }}
    ]
}