背景
文档 1:
PUT /product_v1/sku/1
{
"name": "2015-01-01"
}
文档 2:
PUT /product_v1/sku/2
{
"name": "This is String"
}
先执行文档 1,再执行文档 2,会报以下错误:mapper_parsing_exception
查看product_v1
映射:
GET /product_v1/sku/_mapping
{
"product_v1": {
"mappings": {
"sku": {
"properties": {
"name": {
"type": "date"
}
}
}
}
}
}
可以看到name
的类型自动映射成了date
,而文档 2 传的值类型不匹配。
尝试修改name
的类型为text
:
PUT /product_v1/sku/_mapping
{
"properties": {
"name": {"type": "text"}
}
}
报下面错误,是因为 elasticsearch 中字段的类型一旦确定不允许修改:
解决思路
1、如果没有别名,则添加别名;
2、创建新索引;
3、将旧索引上的数据迁移到新索引上;
4、将别名关联到新索引上并切断与旧索引的关联;
如图所示:
实现
1、如果没有别名,则添加别名product
,如下:
PUT /product_v1/_alias/product
2、新建索引 product_v2
:
PUT /product_v2
{
"mappings": {
"sku": {
"properties": {
"name": {
"type": "text"
}
}
}
}
}
3、迁移数据:
POST _reindex
{
"source": {
"index": "product_v1"
},
"dest": {
"index": "product_v2"
}
}
返回结果:
{
"took": 136,
"timed_out": false,
"total": 1,
"updated": 0,
"created": 1,
"deleted": 0,
"batches": 1,
"version_conflicts": 0,
"noops": 0,
"retries": {
"bulk": 0,
"search": 0
},
"throttled_millis": 0,
"requests_per_second": -1,
"throttled_until_millis": 0,
"failures": []
}
此时查询product_v2
,能看到数据已经做了迁移:
GET /product_v2/sku/_search
4、更改别名关联的索引:
POST _aliases
{
"actions": [
{
"remove": {
"index": "product_v1",
"alias": "product"
}
},
{
"add": {
"index": "product_v2",
"alias": "product"
}
}
]
}
5、查询别名关联的索引:
GET /*/_alias/product
验证
product_v1、product_v2、product
分别添加文档:
PUT /product_v1/sku/2
{
"name": "2015-01-02"
}
PUT /product_v2/sku/3
{
"name": "This is String"
}
PUT /product/sku/4
{
"name": "This is String 4"
}
查询 product_v2、product
:
GET /product_v2/sku/_search
GET /product/sku/_search
返回结果一样:
{
"_index": "product_v2",
"_type": "sku",
"_id": "4",
"_score": 1,
"_source": {
"name": "This is String 4"
}
},
{
"_index": "product_v2",
"_type": "sku",
"_id": "1",
"_score": 1,
"_source": {
"name": "2015-01-01"
}
},
{
"_index": "product_v2",
"_type": "sku",
"_id": "3",
"_score": 1,
"_source": {
"name": "This is String"
}
}