ElasticSearch創(chuàng)建后索引修改數(shù)據(jù)類型方法步驟
一、前言
在 Elasticsearch 中,一旦創(chuàng)建索引,就不能更改現(xiàn)有字段的數(shù)據(jù)類型。如果您需要更改數(shù)據(jù)類型,則需要重新創(chuàng)建索引并使用新的數(shù)據(jù)類型。以下針對各種業(yè)務(wù)場景總結(jié)幾種修改方法。
二、【方法一】刪除重建
這種方式的使用場景為當(dāng)前索引庫數(shù)據(jù)量不大,而且可以及時(shí)同步數(shù)據(jù)到該索引庫。一般用在實(shí)時(shí)采集數(shù)據(jù)到ES中,刪除舊的索引后,重新采集數(shù)據(jù)即可。
delete /my_index
三、【方法二】使用備份數(shù)據(jù)重建
當(dāng)你數(shù)據(jù)量也不算太大,_reindex的執(zhí)行速度還算快的,幾十萬的數(shù)據(jù)量大概在十分鐘以內(nèi),百萬級的大概在半個小時(shí)內(nèi)就可以完全備份,可以先使用備份庫,具體思路如下:
1、獲取源索引的數(shù)據(jù)(mapping) 并 創(chuàng)建臨時(shí)索引:my_index_temp,
2、備份數(shù)據(jù)到臨時(shí)索引:my_index_temp
3、刪除原索引: my_index,
4、重新創(chuàng)建正確數(shù)據(jù)類型索引:my_index
5、再把臨時(shí)索引:my_index_temp的數(shù)據(jù)備份到新創(chuàng)建索引 my_index。
操作步驟如下:
1、獲取原索引
//獲取源索引的mapping數(shù)據(jù) GET my_index/_mapping //返回示例如下 {"my_index": { "mappings": { "cdp_doc": { "properties": { "whyBuy": { "type": "keyword" }, "zipcode": { "type": "keyword" } } } } }
2、創(chuàng)建一個臨時(shí)索引,并備份原索引的數(shù)據(jù)
//代碼如下(示例): //# 創(chuàng)建Mapping PUT my_index_temp { "mappings": { "cdp_doc": { "properties": { "whyBuy": { "type": "keyword" }, "zipcode": { "type": "keyword" } } } } }
3、備份原數(shù)據(jù)
// 同步數(shù)據(jù)值臨時(shí)索引 POST _reindex?refresh&wait_for_completion=false { "conflicts": "proceed", "source": { "index": "my_index" }, "dest": { "index": "my_index_temp", "op_type": "create" } } //查詢確認(rèn)數(shù)據(jù)是否復(fù)制過去 GET my_index_temp/_search { "query": { "term": { } } }
4、刪除原索引及數(shù)據(jù)
//刪除索引及數(shù)據(jù) delete my_index
5、重新創(chuàng)建正確的索引(注意是修改后的索引)
同步驟2
6、遷移舊數(shù)據(jù)回新索引
同步驟3
7、刪除臨時(shí)索引
同步驟4
四、【方法三】使用嵌套增加屬性
這種方法針對索引字段類型text,添加keyword類型操作。
首先區(qū)分一下text類型和keyword類型:
text類型:會進(jìn)行分詞、分詞后建立索引、支持模糊查詢、不支持準(zhǔn)確查詢、不支持聚合查詢。
keyword類型:不會分詞、直接建立索引、不支持模糊查詢、支持準(zhǔn)確查詢、支持聚合查詢。
操作步驟如下:
PUT my_index/_mapping { "properties": { "my_fields": { "type": "text", "analyzer": "ik_smart", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } } // 結(jié)果: { "acknowledged" : true }
注意這里有個問題,如果直接執(zhí)行完后,數(shù)據(jù)不會及時(shí)更新,所以執(zhí)行到這里如果去聚合,舊數(shù)據(jù)是一樣沒有聚合到的,還需要執(zhí)行以下語句更新數(shù)據(jù)
POST my_index/_update_by_query # 后臺執(zhí)行 POST my_index/_update_by_query?wait_for_completion=false
修改完成之后,新的數(shù)據(jù)就會按照新的mapping來走了,可以通過my_fields.keyword的形式進(jìn)行完全匹配和聚合搜索。
五、【方法四】使用數(shù)據(jù)從原索引導(dǎo)入新索引中
假設(shè)您要將一個名為 my_index
的索引中的整數(shù)類型更改為字符串類型。以下示例代碼將源索引中的數(shù)據(jù)復(fù)制到新索引中,并使用新的字段映射規(guī)則:
POST _reindex { "source": { "index": "my_index" }, "dest": { "index": "my_new_index" }, "script": { "source": "ctx._source.my_integer_field = ctx._source.my_integer_field.toString()", "lang": "painless" }, "mappings": { "properties": { "my_integer_field": { "type": "text" } } } }
在上面的代碼中,我們使用腳本將原始索引中的整數(shù)類型字段 my_integer_field
轉(zhuǎn)換為字符串類型,并將其保存到新的索引中。同時(shí),在新索引中定義了一個新的數(shù)據(jù)類型 text
,用于存儲該字段。
切換到新的索引
最后,一旦新索引準(zhǔn)備就緒并包含原始索引的所有數(shù)據(jù),就可以切換應(yīng)用程序以使用新的索引。
需要注意的是,重新創(chuàng)建索引可能會導(dǎo)致數(shù)據(jù)丟失或不可用性。在執(zhí)行此操作之前,請務(wù)必備份和驗(yàn)證數(shù)據(jù)。
總結(jié)
到此這篇關(guān)于ElasticSearch創(chuàng)建后索引修改數(shù)據(jù)類型的文章就介紹到這了,更多相關(guān)ES創(chuàng)建索引修改數(shù)據(jù)類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mall整合SpringTask實(shí)現(xiàn)定時(shí)任務(wù)的方法示例
這篇文章主要介紹了mall整合SpringTask實(shí)現(xiàn)定時(shí)任務(wù)的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-06-06Java大批量導(dǎo)出Excel數(shù)據(jù)的優(yōu)化過程
幾十萬上百萬行的數(shù)據(jù)是很常見的。本文主要介紹了Java大批量導(dǎo)出Excel數(shù)據(jù)的優(yōu)化過程,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08舉例講解Java設(shè)計(jì)模式中的對象池模式編程
這篇文章主要介紹了Java設(shè)計(jì)模式中的對象池模式編程示例分享,對象池模式經(jīng)常在多線程開發(fā)時(shí)被用到,需要的朋友可以參考下2016-02-02IDEA如何自動生成serialVersionUID的設(shè)置
這篇文章主要介紹了IDEA如何自動生成 serialVersionUID 的設(shè)置,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Java使用@Autowired注解獲取對象為null的幾種情況及解決方法
這篇文章主要給大家介紹了使用@Autowired注解獲取對象為null的幾種情況以及?解決方法,文中有詳細(xì)的代碼示例講解,具有一定的參考價(jià)值,需要的朋友可以參考下2023-09-09Java使用wait和notify實(shí)現(xiàn)線程之間的通信
Java 線程通信是將多個獨(dú)立的線程個體進(jìn)行關(guān)聯(lián)處理,使得線程與線程之間能進(jìn)行相互通信,下面這篇文章主要給大家介紹了關(guān)于Java使用wait和notify實(shí)現(xiàn)線程之間通信的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04