Open Source, Open Future!
  menu
107 文章
ღゝ◡╹)ノ❤️

elasticsearch---重建索引

背景

文档 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

image.png

查看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 中字段的类型一旦确定不允许修改:

image.png

解决思路

1、如果没有别名,则添加别名;
2、创建新索引;
3、将旧索引上的数据迁移到新索引上;
4、将别名关联到新索引上并切断与旧索引的关联;
如图所示:

image.png

实现

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"
        }
      }