Elasticsearch的mapping一旦創建,只能增加字段,而不能修改已經mapping的字段。但現實往往並非如此啊,有時增加一個字段,就好像打了一個補丁,一個可以,但是越補越多,最后自己都覺得慘不忍睹了。怎么辦??
這里有一個方法修改mapping,那就是重新建立一個index,然后創建一個新的mapping。你可能會問,這要是在生產環境,可行嗎?答案是,如果你一開始就采取了合適的設計,這個完全是可以做到平滑過渡的。
采取什么合理設計呢?就是我們的程序訪問索引庫時,始終使用同義詞來訪問,而不要使用真正的indexName。在reindex完數據之后,修改之前的同義詞即可。明白了嗎?
參考上面的思路,我們來一步一步做。
step1、創建一個索引,這個索引的名稱最好帶上版本號,比如my_index_v1,my_index_v2等。
step2、創建一個指向本索引的同義詞。
Java代碼
curl -XPOST localhost:9200/_aliases -d '
{
"actions": [
{ "add": {
"alias": "my_index",
"index": "my_index_v1"
}}
]
}
'
此時,你可以通過同義詞my_index訪問。包括創建索引,刪除索引等。
step3,需求來了,需要更改mapping了,此時,你需要創建一個新的索引,比如名稱叫my_index_v2(版本升級).,在這個索引里面創建你新的mapping結構。然后,將新的數據刷入新的index里面。在刷數據的過程中,你可能想到直接從老的index中取出數據,然后更改一下格式即可。如何遍歷所有的老的index數據,請參考這里。
step4,修改同義詞。將指向v1的同義詞,修改為指向v2。http接口如下:
Java代碼
curl -XPOST localhost:9200/_aliases -d '
{
"actions": [
{ "remove": {
"alias": "my_index",
"index": "my_index_v1"
}},
{ "add": {
"alias": "my_index",
"index": "my_index_v2"
}}
]
}
'
step5,刪除老的索引。
Java代碼
curl -XDELETE localhost:9200/my_index_v1
除此之外,還有幾個其他的方法也可以更改mapping。
1、修改程序,添加字段。
就是說,你可以在mapping中增加一個新的字段,然后你對新的字段進行訪問統計搜索。這個就要修改兩個地方,一個是修改mapping增加字段,還有就是修改你的程序,把字段改成新的字段。
2、更改字段類型為multi_field。
multi_field允許為一個字段設置多個數據類型。應用multi_field的一個最典型的場景是:一個類型定義為analyed,這個字段可以被搜索到,一個類型定義為不分詞,這個字段用於排序。
任何字段都可以被更新為multi_field(類型為object和nested的類型除外)。假設現在有一個字段,名字叫created,類型現在為string。
Java代碼
{ "created": { "type": "string"} }
我們可以將它增加一種類型,使他既能被當做字符串又能當做日期型。
Java代碼
curl -XPUT localhost:9200/my_index/my_type/_mapping -d '
{
"my_type": {
"properties": {
"created": {
"type": "multi_field",
"fields": {
"created": { "type": "string" },
"date": { "type": "date" }
}
}
}
}
}
'
采用標准的重建索引方式的時候,我們推薦大家為每一個type都建立一個索引同義詞,即便在同一個索引庫中的多個type,也推薦使用建立一個同義詞來訪問。即一個index里面包含一個type,因為在elasticsearch中,跨index查詢數據是很方便的。這樣,我們就可以在reindex一個type后,立即將type生效,而不是將index下面所有的type都重建完后,同義詞才能生效。
————————————————
版權聲明:本文為CSDN博主「冷峰的思考」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/lengfeng92/article/details/38230521