1、重建索引
一個field的設置是不能被修改的,如果要修改一個Field,那么應該重新按照新的mapping,建立一個index,然后將數據批量查詢出來,重新用bulk api寫入index中
批量查詢的時候,建議采用scroll api,並且采用多線程並發的方式來reindex數據,每次scoll就查詢指定日期的一段數據,交給一個線程即可
1.1如果說舊索引的名字,是old_index,新索引的名字是new_index,終端java應用,已經在使用old_index在操作了,難道還要去停止java應用,修改使用的index為new_index,才重新啟動java應用嗎?這個過程中,就會導致java應用停機,可用性降低
給java應用一個別名,這個別名是指向舊索引的,java應用先用着,java應用先用goods_index alias來操作,此時實際指向的是舊的my_index
PUT /my_index/_alias/goods_index
1.2新建一個index,調整其字段的類型
1.3使用scroll api將數據批量查詢出來
GET /my_index/_search?scroll=1m
{
"query": {
"match_all": {}
},
"sort": ["_doc"],
"size": 1
}
1.4采用bulk api將scoll查出來的一批數據,批量寫入新索引
POST /_bulk
{ "index": { "_index": "my_index_new", "_type": "my_type", "_id": "2" }}
{ "title": "2017-01-02" }
反復循環,查詢一批又一批的數據出來,采取bulk api將每一批數據批量寫入新索引
1.5將goods_index alias切換到my_index_new上去,java應用會直接通過index別名使用新的索引中的數據,java應用程序不需要停機,零提交,高可用
POST /_aliases
{
"actions": [
{ "remove": { "index": "my_index", "alias": "goods_index" }},
{ "add": { "index": "my_index_new", "alias": "goods_index" }}
]
}
(12)直接通過goods_index別名來查詢,是否ok
GET /goods_index/my_type/_search
2、基於alias對client透明切換index