elasticsearch 修改 mapping


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM