如果你也是將 Elastic 當作搜尋快取再使用的話,一定也會常常碰到一些情況需要 Reindex。
我們一開始在使用的時候常碰到幾個問題,Logstash 沒指定 db 欄位的 type,到了 elastic 上後結果跟預期不符,或是 db / elastic 上的資料不一致等等問題,這時候我們需要的就是 reindex。
以下就是 reindex 的步驟與一些注意事項。
先開新的 index 假設叫做 member,後面我們加上版本號 member_version_1
PUT /member_verison_1 {}
如果有需要可以先指定 field 的 type
PUT /member_verison_1/_mapping
{
    "properties": {
      "height": {
        "type": "short"
      }
    }
}
在 reindex 的時候就不要 copy 這欄的資料,用 ingest node 搭配 pipeline
先新增 ingest node
PUT _ingest/pipeline/pass_height
{
  "description": "Removes the 'height' field",
  "processors": [
    {
      "remove": {
        "field": ["height"],
        "ignore_missing": true
      }
    }
  ]
}
準備 OK 開始 reindex
POST _reindex?wait_for_completion=false
{
  "source": {
    "index": "member"
  },
  "dest": {
    "index": "member_version_1",
    "pipeline": "height_error"
  }
}
通常 reindex 都需要一段時間為避免 timeout 加上 wait_for_completion,會回傳 task 的 id,可以在用 task 查詢 reindex 的狀況。
GET /_tasks/HSEnIEfuTaCLI-V7bRj3lg:17533795
接下來要設定 alias,如果原本的 index 就叫 member 沒有加上 version 的話,我們就只能先刪掉原本的 index,再加上 alias
DELETE /member
加上 alias
PUT /member_version_1/_alias/member
如果原本就有設定 alias 的話要先移除
POST /_aliases
{
    "actions" : [
        { "remove" : { "index" : "member_version_1", "alias" : "member" } }
    ]
}
結束,以上就是盡可能平滑無痛 reindex 的步驟,透過 alias 的方式,基本上對前端查詢不會有什麼影響,就算要花一段時間重建也不用擔心囉!