使用ElasticSearch 作為搜索模型時有一個很大問題是盗舰,每當更改架構時都必須重新編制索引拜马。數(shù)據(jù)集很大時需要很長的時間阅束,這給我們帶來了很多停機時間殃饿。對于大多數(shù)應用程序來說太多了。
本文將介紹如何在0停機情況下修改Elasticsearch mapping
問題: 為什么不能修改已存在數(shù)據(jù)的字段類型孝扛?
為了使您的數(shù)據(jù)可搜索列吼,數(shù)據(jù)庫需要知道每個字段包含什么類型的數(shù)據(jù)以及應如何對其進行索引。如果將字段類型從a切換string為a date苦始,那么已經為該字段建立索引的所有數(shù)據(jù)將變得無用寞钥。所以您需要重新索引該字段。
這不僅適用于Elasticsearch陌选,而且適用于使用索引進行搜索的任何數(shù)據(jù)庫理郑。而且,如果不使用索引咨油,則會犧牲查詢速度香浩。
Elasticsearch(和Lucene)將其索引存儲在不可變的段中
?-每個段都是一個“微型”反向索引。這些字段永遠不會更新臼勉。更新文檔實際上會創(chuàng)建一個新文檔并將舊文檔標記為已刪除邻吭。文檔(或更新現(xiàn)有文檔),創(chuàng)建新的段宴霸,并在后臺運行合并過程囱晴,將幾個較小的字段合并為一個新的大字段,然后將舊字段完全刪除瓢谢。
通常畸写,Elasticsearch中的索引將包含不同類型的文檔。每個_type都有自己的模式或映射氓扛。一個段可以包含任何類型的文檔枯芬。因此,如果要更改單個類型中單個字段的字段定義采郎,除了重新索引索引中的所有文檔外千所,別無選擇。
Elasticsearch如何修改Mapping
1.添加字段蒜埋,可以使用elasticsearch 的添加字段api添加字段, 這種情況下無需reindex:
將新字段添加到現(xiàn)有索引或更改現(xiàn)有字段的搜索設置淫痰。
PUT /twitter/_mapping
{
"properties": {
"email": {
"type": "keyword"
}
}
}
2.使用_reindex api將文檔復制已定義好Mapping的index中
curl -XPOST localhost:9200/_reindex?pretty -d'{
"source": {
"index": "src"
},
"dest": {
"index": "dest"
}
}
在不停機的狀態(tài)下更新Mapping
索引別名(alias) 使我們能夠靈活地在后臺重新索引數(shù)據(jù),一個別名就像一個符號鏈接可以指向一個或多個真實索引(Index)整份。
典型的工作流程如下待错。首先籽孙,創(chuàng)建一個索引,在名稱后附加一個版本或時間戳:
curl -XPUT localhost:9200/my_index_v1 -H 'Content-Type: application/json' -d '
{ ... mappings ... }
創(chuàng)建一個指向索引的別名:
curl -XPOST localhost:9200/_aliases -H 'Content-Type: application/json' -d '
{
"actions": [
{ "add": {
"alias": "my_index",
"index": "my_index_v1"
}}
]
}
現(xiàn)在火俄,您的應用程序可以像真實索引一樣使用my_index
需要重新索引數(shù)據(jù)時犯建,可以創(chuàng)建新索引,并附加新的版本號:
curl -XPUT localhost:9200/my_index_v2 -H 'Content-Type: application/json' -d '
{ ... mappings ... }
將數(shù)據(jù)從重新索引瓜客,my_index_v1到new my_index_v2 (參考上面reindex內容)适瓦,然后更改myindex別名以指向新索引:
curl -XPOST localhost:9200/_aliases -H 'Content-Type: application/json' -d '
{
"actions": [
{ "remove": {
"alias": "my_index",
"index": "my_index_v1"
}},
{ "add": {
"alias": "my_index",
"index": "my_index_v2"
}}
]
}
最后,刪除舊索引:
curl - XDELETE本地主機:9200 / my_index_v1
這樣就可以在后臺重新索引了所有數(shù)據(jù)忆家,而沒有任何停機時間。