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ù)據(jù)到該索引庫。一般用在實時采集數(shù)據(jù)到ES中,刪除舊的索引后,重新采集數(shù)據(jù)即可。
delete /my_index
三、【方法二】使用備份數(shù)據(jù)重建
當(dāng)你數(shù)據(jù)量也不算太大,_reindex的執(zhí)行速度還算快的,幾十萬的數(shù)據(jù)量大概在十分鐘以內(nèi),百萬級的大概在半個小時內(nèi)就可以完全備份,可以先使用備份庫,具體思路如下:
1、獲取源索引的數(shù)據(jù)(mapping) 并 創(chuàng)建臨時索引:my_index_temp,
2、備份數(shù)據(jù)到臨時索引:my_index_temp
3、刪除原索引: my_index,
4、重新創(chuàng)建正確數(shù)據(jù)類型索引:my_index
5、再把臨時索引: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ù)據(jù)
//代碼如下(示例):
//# 創(chuàng)建Mapping
PUT my_index_temp
{
"mappings": {
"cdp_doc": {
"properties": {
"whyBuy": {
"type": "keyword"
},
"zipcode": {
"type": "keyword"
}
}
}
}
}3、備份原數(shù)據(jù)
// 同步數(shù)據(jù)值臨時索引
POST _reindex?refresh&wait_for_completion=false
{
"conflicts": "proceed",
"source": {
"index": "my_index"
},
"dest": {
"index": "my_index_temp",
"op_type": "create"
}
}
//查詢確認數(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、刪除臨時索引
同步驟4
四、【方法三】使用嵌套增加屬性
這種方法針對索引字段類型text,添加keyword類型操作。
首先區(qū)分一下text類型和keyword類型:
text類型:會進行分詞、分詞后建立索引、支持模糊查詢、不支持準確查詢、不支持聚合查詢。
keyword類型:不會分詞、直接建立索引、不支持模糊查詢、支持準確查詢、支持聚合查詢。
操作步驟如下:
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ù)不會及時更新,所以執(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的形式進行完全匹配和聚合搜索。
五、【方法四】使用數(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ù)據(jù)類型 text,用于存儲該字段。
切換到新的索引
最后,一旦新索引準備就緒并包含原始索引的所有數(shù)據(jù),就可以切換應(yīng)用程序以使用新的索引。
需要注意的是,重新創(chuàng)建索引可能會導(dǎo)致數(shù)據(jù)丟失或不可用性。在執(zhí)行此操作之前,請務(wù)必備份和驗證數(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實現(xiàn)定時任務(wù)的方法示例
這篇文章主要介紹了mall整合SpringTask實現(xiàn)定時任務(wù)的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-06-06
Java大批量導(dǎo)出Excel數(shù)據(jù)的優(yōu)化過程
幾十萬上百萬行的數(shù)據(jù)是很常見的。本文主要介紹了Java大批量導(dǎo)出Excel數(shù)據(jù)的優(yōu)化過程,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
IDEA如何自動生成serialVersionUID的設(shè)置
這篇文章主要介紹了IDEA如何自動生成 serialVersionUID 的設(shè)置,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Java使用@Autowired注解獲取對象為null的幾種情況及解決方法
這篇文章主要給大家介紹了使用@Autowired注解獲取對象為null的幾種情況以及?解決方法,文中有詳細的代碼示例講解,具有一定的參考價值,需要的朋友可以參考下2023-09-09
Java使用wait和notify實現(xiàn)線程之間的通信
Java 線程通信是將多個獨立的線程個體進行關(guān)聯(lián)處理,使得線程與線程之間能進行相互通信,下面這篇文章主要給大家介紹了關(guān)于Java使用wait和notify實現(xiàn)線程之間通信的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2022-04-04

