写点什么

Elasticsearch Reindex & Index Alias

用户头像
escray
关注
发布于: 2021 年 03 月 10 日
Elasticsearch Reindex & Index Alias

Elasticsearch Reindex & Index Alias,内容来自 B 站中华石杉 Elasticsearch 顶尖高手系列课程核心知识篇,英文内容来自 Elasticsearch: The Definitive Guide [2.x]。

重建索引

Reindex Your data


... you can't add new analyzers or make changes to existing fields....create a new index with the new settings and copy all of your documents from the old index to the new index.


To reindex all of the documents from the old index efficiently, use scroll to retrieve batches of documents from the old index, and the bulk API to push them into the new index.


一个 field 的设置是不能被修改的,如果要修改一个 Field,那么应该重新按照新的 mapping,建立一个 index,然后将数据批量查询出来,重新用 bulk api 写入 index 中


批量查询的时候,建议采用 scroll api,并且采用多线程并发的方式来 reindex 数据,每次 scoll 就查询指定日期的一段数据,交给一个线程即可


  1. 插入数据


一开始,依靠 dynamic mapping,插入数据,但是不小心有些数据是 2017-01-01 这种日期格式的,所以 title 这种 field 被自动映射为了 date 类型,实际上它应该是 string 类型的


PUT my_index_02/_doc/1{  "title": "2021-03-10"}
GET my_index_02/_mapping
{ "my_index_02" : { "mappings" : { "dynamic_templates" : [ ... ], "properties" : { "title" : { "type" : "date" } } } }}
复制代码


  1. 问题来了


当后期向索引中加入 string 类型的 title 值的时候,就会报错


PUT my_index_02/_doc/2{  "title": "my first article"}
{ "error": { "root_cause": [ { "type": "mapper_parsing_exception", "reason": "failed to parse field [title] of type [date] in document with id '2'. Preview of field's value: 'my first article'" } ],...
复制代码


  1. type 无法修改


如果此时想修改 title 的类型,是不可能的


PUT my_index_02/_mappings{  "properties": {    "title": {      "type": "text"    }  }}
{ "error": { "root_cause": [ { "type": "illegal_argument_exception", "reason": "mapper [title] of different type, current_type [date], merged_type [text]" } ], ...
复制代码


  1. 怎么办?


利用别名重建索引

Index Aliases and Zero Downtime


The problem with the reindexing process is that you need to update your application to use the new index name. Index aliases to the rescue!


An index alias is like a shortcut or symbolic link


  • Switch transparently between one index an another on a running cluster

  • Group multiple indices (for example, last_three_months)

  • Create "views" on a subset of the documents in an index

PUT /my_index_v1
PUT /my_index_v1/_alias/my_alias_index
GET /*/_alias/my_alias_indexGET /my_index_v1/_alias/*
{ "my_index_v1" : { "aliases" : { "my_alias_index" : { } } }}
PUT /my_index_v2{ "mappings": { "properties": { "tags": { "type": "keyword" } } }}
POST /_aliases{ "actions": [ { "remove": { "index": "my_index_v1", "alias": "my_alias_index" }}, { "add": { "index": "my_index_v2", "alias": "my_alias_index" }} ]}
复制代码


此时,唯一的办法,就是进行 reindex,也就是说,重新建立一个索引,将旧索引的数据查询出来,再导入新索引


如果说旧索引的名字,是 old_index,新索引的名字是 new_index,终端 Java 应用,已经在使用 old_index 在操作了,难道还要去停止 Java 应用,修改使用的 index 为 new_index,才重新启动 Java 应用吗?这个过程中,就会导致 Java 应用停机,可用性降低


所以说,给 Java 应用一个别名,这个别名是指向旧索引的,Java 应用先用着,Java 应用先用 good_sindex alias 来操作,此时实际指向的是旧的 my_index


新建一个 index,调整其 title 的类型为 keyword


发布于: 2021 年 03 月 10 日阅读数: 15
用户头像

escray

关注

Let's Go 2017.11.19 加入

在学 Elasticsearch 的项目经理

评论

发布
暂无评论
Elasticsearch Reindex & Index Alias