1. 程式人生 > >Elasticsearch mapping field修改過程

Elasticsearch mapping field修改過程

Elasticsearch 的坑爹事 

本文記錄一次Elasticsearch mapping field修改過程


團隊使用Elasticsearch做日誌的分類檢索分析服務,使用了類似如下的_mapping

1234567891011121314{"settings" : {"number_of_shards" : 20},"mappings" : {"client" : {"properties" : {"ip" : {"type" "long"},"cost" : {"type" "long"},}

 
現在問題來了,日誌中輸出的"127.0.0.1"這類的IP地址在Elasticsearch中是不能轉化為long的(報錯Java.lang.NumberFormatException),所以我們必須將欄位改為string型或者ip型(Elasticsearch支援, 資料型別可見

mapping-core-types)才能達到理想的效果.

目標明確了,就是改掉mapping的ip的field type即可.
elasticsearch.org找了一圈 嘿嘿, update一下即可

12345678curl -XPUT localhost:8301/store/client/_mapping -d '{"client" : {"properties" : {"local_ip" : {"type" "string""store" "yes"}   }}}


報錯結果

1{"error":"MergeMappingException[Merge failed with failures {[mapper [local_ip] of different type, current_type [long], merged_type [string]]}]"
,"status":400}



尼瑪 真逗  我long想轉一下string 居然失敗(elasticsearch產品層面理應支援這種無損轉化)  無果
Google了一下類似的案例 (案例)
在一個帖子中得到的elasticsearch開發人員的準確答覆


  "You can't change existing mapping type, you need to create a new index with the correct mapping and index the data again."

想想 略坑啊 我不管是因為elasticsearch還是因為底層Lucene的原因,修改一個field需要對所有已有資料的所有field進行reindex,這本身就是一個逆天的思路,但是elasticsearch的研發人員還覺得這沒有什麼不合理的.

在Elasticsearch上游逛了一圈,上面這樣寫到
(http://www.elasticsearch.org/blog/changing-mapping-with-zero-downtime/)
the problem — why you can’t change mappings

You can only find that which is stored in your index. In order to make your data searchable, your database needs to know what type of data each field contains and how it should be indexed. If you switch a field type from e.g. a string to a date, all of the data for that field that you already have indexed becomes useless. One way or another, you need to reindex that field.

...
OK,這一段話很合理,我改了一個field的型別 需要對這個field進行reindex,如論哪種資料庫都需要這麼做,沒錯.
我們再繼續往下看看,reindexing your data, 尼瑪一看,弱爆了,他的reindexing your data不是對修改的filed進行reindex,而是建立了一個新的index,對所有的filed進行reindexing, 太逆天了。

吐槽歸吐槽,這個事情逃不了,那我就按他的來吧.
首先建立一個新的索引

123456789101112131415curl -XPUT localhost:8305/store_v2 -d '{"settings" : {"number_of_shards" : 20},"mappings" : {"client" : {"properties" : {"ip" : {"type" "string"},"cost" : {"type" "long"},}


等等,我建立了新索引,client往Elasticsearch的程式碼不會需要修改吧,瞅了一眼,有解決方案,建立一個alias(別名,和C++引用差不多),通過alias來實現對後面索引資料的解耦合,看到這,舒了一口氣。

現在的問題是 這是一個線上服務,不能停服務,所以我需要一個倒資料到我的新索引的一個方案
Elasticsearch官網寫到
  pull the documents in from your old index, using a scrolled search and index them into the new index using the bulk API. Many of the client APIs provide a reindex() method which will do all of this for you. Once you are done, you can delete the old index.
第一句,看起來很美好,找了一圈,尼瑪無圖無真相,Google都沒有例子,你讓我怎麼導資料?
第二句 client APIS, 看起來只有這個方法可搞了

python用起來比較熟,所以我就直接選 pyes了,裝了一大堆破依賴庫之後,終於可以run起來了

12345678import pyesconn = pyes.es.ES("http://10.xx.xx.xx:8305/")search = pyes.query.MatchAllQuery().search(bulk_read=1000)hits = conn.search(search, 'store_v1''client', scan=True, scroll="30m", model=lambda _,hit: hit)for hit in hits:#print hitconn.index(hit['_source'], 'store_v2''client', hit['_id'], bulk=True)conn.flush()

 
花了大概一個多小時,新的索引基本和老索引資料一致了,對於線上完成瞬間的增量,這裡沒心思關注了,資料準確性要求沒那麼高,得過且過。

接下來修改alias別名的指向(如果你之前沒有用alias來改mapping,納尼就等著哭吧)

1234567891011121314curl -XPOST localhost:8305/_aliases -d '{"actions": ["remove": {"alias""store","index""store_v1"}},"add": {

相關推薦

Elasticsearch mapping field修改過程

Elasticsearch 的坑爹事  本文記錄一次Elasticsearch mapping field修改過程團隊使用Elasticsearch做日誌的分類檢索分析服務,使用了類似如下的_mapping

Elasticsearch mapping field修改過程

Elasticsearch 的坑爹事 本文記錄一次Elasticsearch mapping field修改過程團隊使用Elasticsearch做日誌的分類檢索分析服務,使用了類似如下的_mapping1234567891011121314{"settings" : {"n

Elasticsearch 的坑爹事——記錄一次mapping field修改過程

本文記錄一次Elasticsearch mapping field修改過程 團隊使用Elasticsearch做日誌的分類檢索分析服務,使用了類似如下的_mapping 1 2 3 4 5 6 7 8

圖解Elasticsearch之一——索引建立過程

0、引言 這是國外培訓ppt課程的節選內容。 以下是我們的Core Elasticsearch:Operations課程中的一些很棒的幻燈片,它們有助於解釋分片分配的概念。 我們建議您更全面地瞭解這一點,但我會在此提供我們培訓的概述: 分片分配是將分片分配給節點的過程。 這可能發

elasticsearch叢集引數修改

elasticsearch.yml中儘量只寫必備的引數,其他可以通過api動態設定的引數都通過api來設定 動態設定的引數有transient和persistent兩種設定,前者在叢集重啟後會丟失,後者不會,但兩種設定都會覆蓋elasticsearch.yml中的配置。 PUT /_

Elasticsearch教程 elasticsearch Mapping的建立

一、Mapping介紹 在 Elasticsearch  中, Mapping  是什麼? mapping  在 Elasticsearch  中的作用就是約束。 1.資料型別宣告 它類似於靜態語言中的資料型別宣告,比如宣告一個欄位為String, 以後這個變數都只能

TF-Faster-RCNN訓練篇(基礎版)結合自己訓練的修改過程而撰寫

這裡,我就主要記錄一下自己在跑tensorflow框架下的faster-rcnn。首先,就是硬體要求,這裡只能做到使用一塊GPU。具體環境要求:        1.Ubuntu  16.04系統、CUDA 8.0和cudnn(可以支援NVIDIA的GPU運算,當然有很多人在說

elasticsearch-mapping欄位重要屬性

curl -XPUT 'localhost:9200/my_index?pretty' -H 'Content-Type: application/json' -d' { "mappings": { "my_type": { "properties": { "text"

Elasticsearch Mapping型別對映概述與元欄位型別

Mapping,對映,相當於關係型資料庫建立語句,定義文件欄位及其型別、索引與儲存方式。通常會涉及如下方面: 文件中哪些欄位需要定義成全文索引欄位。 文件中哪些欄位定義為精確值,例如日期,數字、地理位置等。 文件中哪些欄位需要被索引(能通過該欄位的值查詢文件)

Elasticsearch Mapping設定

Mapping類似資料庫中的表結構定義,主要作用如下: 定義Index下的欄位名(Field Name) 定義欄位的型別,比如資料型、字串型、布林型等 定義倒排索引相關配置,比如是否索引、記錄position等 自定義mapping: Mappin

關於TP5檢視分離到根目錄的解決方法 原有: 為了方便前端開發,我想把檢視(view)部分分離出來專門給前端進行修改 過程:在進行檢視設定分離的過程遇到了問題 參考了官方文件http://www

關於TP5檢視分離到根目錄的解決方法原有: 為了方便前端開發,我想把檢視(view)部分分離出來專門給前端進行修改過程:在進行檢視設定分離的過程遇到了問題參考了官方文件http://www.kancloud.cn/manual/thinkphp5/119298後進行修改

深入elasticsearch原始碼之索引過程

呼叫es 2..2.1 的 java Api在ES叢集中索引一個文件 客戶端大致流程: 使用XContentBuilder構建索引的json串,也可直接用json字串 使用TransportClient連線ES叢集 傳送索引到叢集並獲取IndexRes

elasticsearch document的索引過程分析

elasticsearch專欄:https://www.cnblogs.com/hello-shf/category/1550315.html   一、預備知識 1.1、索引不可變 看到這篇文章相信大家都知道es是倒排索引,不瞭解也沒關係,在我的另一篇博文中詳細分析了es的倒排索引機制。在e

Elasticsearch系列---搜尋執行過程及scroll遊標查詢

概要 本篇主要介紹一下分散式環境中搜索的兩階段執行過程。 兩階段搜尋過程 回顧我們之前的CRUD操作,因為只對單個文件進行處理,文件的唯一性很容易確定,並且很容易知道是此文件在哪個node,哪個shard中。 但搜尋比CRUD複雜,符合搜尋條件的文件,可能散落在各個node、各個shard中,我們需要找到匹配

ElasticSearch最佳入門實踐(四十四)手動建立和修改mapping以及定製string型別資料是否分詞

1、如何建立索引 如果想設定 string 為分詞 把它設定為 analyzed not_analyzed 則是 設定為 exact value 全匹配 no 則 是不能被索引和匹配 2、修改mapping 注意事項:只能建立index時手動建立mapp

Elasticsearch索引mapping的寫入、檢視與修改

mapping的寫入與檢視 首先建立一個索引: curl -XPOST "http://127.0.0.1:9200/productindex" {"acknowledged":true} 現在只建立了一個索引,並沒有設定mapping,檢視一下索引mapping的

elasticsearch建立multi-fields欄位及修改非multi-fields欄位為multi-fields欄位及multi-field欄位的不同的analyzer進行分析和搜尋

本文使用的elasticsearch是5.2.1,官方的multi-fields例子參見 https://www.elastic.co/guide/en/elasticsearch/reference/5.3/multi-fields.html 建立一個index及type

Elasticsearch如何修改Mapping結構並實現業務零停機

Elasticsearch 版本:6.4.0 一、疑問 在專案中後期,如果想調整索引的 Mapping 結構,比如將 ik_smart 修改為 ik_max_word 或者 增加分片數量 等,但 Elasticsearch 不允許這樣修改呀,怎麼辦? 常規 解決方法: 根據最新的 Mapping 結構

elasticsearch index 之 Mapping

splay ima 更多 trie name .post 結構 emp parser Lucene索引的一個特點就filed,索引以field組合。這一特點為索引和搜索提供了很大的靈活性。elasticsearch則在Lucene的基礎上更近一步,它可以是 no schem

ElasticSearch添加mapping

log void exe replicas blog 創建 修改 index obj 1.創建索引 /** * 創建索引 * * @param indexName */public static void createIndex(String indexName) {