Elasticsearch Reindex & Index Alias
Elasticsearch Reindex & Index Alias,内容来自 B 站中华石杉 Elasticsearch 顶尖高手系列课程核心知识篇,英文内容来自 Elasticsearch: The Definitive Guide [2.x]。
重建索引
... 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 就查询指定日期的一段数据,交给一个线程即可
插入数据
一开始,依靠 dynamic mapping,插入数据,但是不小心有些数据是 2017-01-01 这种日期格式的,所以 title 这种 field 被自动映射为了 date 类型,实际上它应该是 string 类型的
问题来了
当后期向索引中加入 string 类型的 title 值的时候,就会报错
type 无法修改
如果此时想修改 title 的类型,是不可能的
怎么办?
利用别名重建索引
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
此时,唯一的办法,就是进行 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
版权声明: 本文为 InfoQ 作者【escray】的原创文章。
原文链接:【http://xie.infoq.cn/article/be26af6b475b29190230ad468】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论