Elasticsearch中你不能新增新的分析器或修改已有欄位。所以我們不得不修改的時候就建立一個新配置好的索引,然後將資料遷移到新的索引中。
如果你的應用中使用的是索引的名稱,你就需要更新你的應用。即使你覺得你的索引設計的已經很完美了,但是需求你懂的,我相信你一定也深有體會。所以最好的做法就是在你的應用中使用別名而不是索引。這樣你就可以在任何時候重建索引。別名的開銷很小,應當被廣泛的使用。
方法/步驟
操作別名的兩個方法:
_alias:單個操作
_aliases:多個操作,原子性的操作
建立別名
curl -XPUT 'localhost:9200/dm_v1/_alias/dm'
curl -XPOST '; -d '
{
"actions" : [
{ "add" : { "index" : "dm_v1", "alias" : "dm_alias" } }
]
}'
刪除別名
curl -XPOST '; -d '
{
"actions" : [
{ "remove" : { "index" : "dm_v1", "alias" : "dm_alias" } }
]
}'
curl -XDELETE 'localhost:9200/dm_v1/_alias/dm_alias'
刪除別名的同時新增別名到新的索引,該操作時原子性的,不用擔心存在別名沒有指向任何索引的瞬間
Renaming an alias is a simple remove then add operation within the same API. This operation is atomic, no need to worry about a short period of time where the alias does not point to an index:
curl -XPOST '; -d '
{
"actions" : [
{ "remove" : { "index" : "dm_v1", "alias" : "dm" } },
{ "add" : { "index" : "dm_v2", "alias" : "dm" } }
]
}'
查詢別名
通過別名查詢所指向的索引:
curl -XGET 'localhost:9200/_alias/dm'
curl -XGET 'localhost:9200/_alias/dm*'
查詢指向該索引下的所有別名:
curl -XGET 'localhost:9200/dm_v2/_alias/*'
也可以通過head檢測別名是否存在
curl -XHEAD -i 'localhost:9200/_alias/dm'
curl -XHEAD -i 'localhost:9200/_alias/dm*'
curl -XHEAD -i 'localhost:9200/dm_v2/_alias/*'
別名應該算是搞定啦,後面就是資料的遷移啦。
前面有一篇用hadoop操作ES的可以參考。
使用scan scroll來批量讀取,bulk API批量索引資料應該是一種高效的方法。後續可以再寫一個詳細的實現啦。That's all!
0 Hadoop 讀寫 Elasticsearch