zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

ElasticSearch数据库修改分片数、副本数及修改mapping字段

数据库elasticsearch 修改 字段 分片 Mapping 副本
2023-09-11 14:15:14 时间

1、修改副本数

        对于已经存在的索引,副本数可以随时修改。

PUT info_data2/_settings
{
  "number_of_replicas": 1
}

# 或者
PUT info_data2/_settings
{
  "index": {
    "number_of_replicas": 2
  }
}

示例演示如下:

GET info_data2/_settings

PUT info_data2/_settings
{
  "number_of_replicas": 1
}

GET info_data2/_settings

2、修改分片数

        ElasticSearch中的数据会被分别存储在不同的分片上,索引库的分片数量是在索引库创建的时候通过settings去设置的,如果不设置,分片数默认是5,分片数一旦确定就不能改变。分片数量的设置最好是机器的整倍数。

        随着数据量的增大,每个分片中的数据量也会不断增加,为了不使每个分片中的数据量过大,就需要增加分片的数量,但是分片数在索引库创建之初就已经确定,并且不能改变。

        为了能够改变索引分片的数量,ElasticSearch中设置了重新索引机制来实现。

如果直接执行下面的语句,会报错的:

PUT test/_settings
{
    "index": {
        "number_of_shards" : 1
    }
}

2.1 重新索引

        重新索引就是创建一个和原索引库结构属性都基本一样的新的索引库,然后将原索引库中的数据复制到新的索引库当中。在新的索引库中,除了需要变更的地方,比如某些字段的数据类型和分片数,其他的所有属性都一样。

2.2 案例演示

2.2.1 创建一个info_data索引库

        创建一个info_data索引,此时执行分片数为3.

PUT info_data
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "id": {
        "type": "integer"
      },
      "name": {
        "type": "text"
      }
    }
  }
}

2.2.2 向info_data库中插入数据

        向info_data索引中插入一些数据,为后续数据迁移做准备。

PUT info_data/_doc/1
{
  "id": "1",
  "name": "dgw"
}

PUT info_data/_doc/2
{
  "id": "2",
  "name": "dgw2"
}

PUT info_data/_doc/3
{
  "id": "3",
  "name": "dgw3"
}

2.2.3 查询info_data库中数据

GET info_data/_search
{
  "query": {
    "match_all": {}
  }
}

2.2.4 新建索引info_data2

        与info_data不同的地方是指定的分片数的数量,其它属性都和info_data中相同。

注意:需要先获取到info_data中的settings信息和mapping信息。建立索引info_data2时要同时带上settings和mapping信息,如果建立索引先只有settings,然后再建mapping时会报错。

GET info_data/_settings

GET info_data/_mapping

然后将settings和mapping信息组装在一起。

创建新索引info_data2:

PUT info_data2
{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 3
  },
  "mappings": {
    "properties": {
      "id": {
        "type": "integer"
      },
      "name": {
        "type": "text"
      }
    }
  }
}

2.2.5 查看info_data2中settings和mapping

GET info_data2

2.2.6 拷贝数据(迁移数据)

        将info_data中的数据复制到info_data2中。

POST _reindex
{
  "source": {
    "index": "info_data"
  },
  "dest": {
    "index": "info_data2"
  }
}

2.2.7 删除之前的旧索引info_data

# 删除旧索引
DELETE info_data

 2.2.8 为新索引起个别名,别名为旧索引的名称

# 为新索引起别名
PUT info_data2/_alias/info_data

注意:起别名前要确保别名不是已经存在的索引,如果存在则报错!这也是起别名之前先删除旧索引的原因!

2.2.9 查询旧索引(即为新索引的别名)

# 查询旧索引(即为新索引的别名)
GET info_data
 
# 效果等同于 GET info_data
GET info_data2

注意:新起的别名是不能DELETE的!抛出异常!

3、增加字段

        可以直接添加新的字段。

3.1 示例演示

查看当前索引的mapping信息:

GET info_data2/_mapping

添加新的字段:

PUT info_data2/_mapping
{
  "properties": {
    "age": {
      "type": "integer"
    }
  }
}

再次查看索引mapping信息:

GET info_data2/_mapping

注意:可以新增加字段,不能修改已经存在字段的属性信息。