弱いエンジニアの備忘録

自分的に気になった技術に関するメモや備忘録です。Elasticsearchに関する記事が多くなりそうです。

elasticsearchでデータ型を修正するメモ

概要

elasticsearchに入れたデータの型を修正する手順をメモ。

バージョン情報など

elasticsearch-6.0.0-alpha2
kibana-6.0.0-alpha2

前提

・elasticsearchにデータを入れてみたけど、やっぱりデータ型が違っていた。
・データ量がそれほど大きくない

reindexAPIを使った方がスマートな場合も多々ありますが、
今回はKibanaのConsoleからmappingを修正して、Logstashなどでデータを再投入する場合を想定します。

想定するシチュエーション

ユーザーのアカウント情報を示すaccountというindexにデータを突っ込んでみました。

kibanaで可視化するためにindex patternを作成...
f:id:shin0higuchi:20170703225034p:plain

確認してみるとageがstringになっています。
平均年齢とかをグラフ化する時とかに困ります。
f:id:shin0higuchi:20170703225542p:plain

ageが数字として扱われるようにmappingを修正してみます。

手順

1. 現在のmapping情報を取得する。

GET index名 をKIbanaのConsoleから実行することで、indexの情報を取得できます。
画像を見るとageのフィールドがtext型として定義されていることがわかりますね。
f:id:shin0higuchi:20170703230540p:plain

2. mappingの内容をコピーする。

先ほど右画面に出力されたjsonを畳むと、aliases, mappings, settingsなどの項目があるのがわかりますが、
今回はmappingの部分のみをコピーします。

f:id:shin0higuchi:20170703230740p:plain
f:id:shin0higuchi:20170703231150p:plain
f:id:shin0higuchi:20170703230948p:plain

こんな感じでコピーします。

3. mappingを変更する。

今度はConsoleの左画面を使います。
PUT index名 でindexを作成でき、その際にmappingを定義することができます。

f:id:shin0higuchi:20170703231417p:plain

これだとindexが作られるだけ。
中にmappingの定義を記述することで、データ型の定義などができます。


先ほどコピーしたmappingの内容を波括弧の中に貼り付けます。
f:id:shin0higuchi:20170703231534p:plain


そして、該当箇所のデータ型を書き換えます。
今回はageをintegerに書き換えています。
f:id:shin0higuchi:20170703231844p:plain

4. 変更したmappingを適用する。

さて、mapping定義を書き換えたので、実行してみます。
f:id:shin0higuchi:20170703232215p:plain
....怒られましたね。
indexが既に存在している場合、PUT index名によってmapping定義を上書きすることはできません。
なので、「indexの削除」→「mappingの定義」→「データの再投入」という手順を踏みます。
(ダウンタイムを極力減らしたい場合は、別名のindexにデータを新しく入れて、aliasを切り替えるという手もありですね。) 

indexをDELETEして...
f:id:shin0higuchi:20170703232611p:plain

再実行
f:id:shin0higuchi:20170703232714p:plain

こんどは上手く行きました☺️

5. データを再投入して型を確認する

データ型の修正もしたところで、データをもう一度入れて、型を確認してみましょう。

index patternsの画面で一度refreshを押して
f:id:shin0higuchi:20170703233118p:plain

ageのところを見ると....
f:id:shin0higuchi:20170703233241p:plain

しっかりnumberとして認識されていました。
めでたしめでたし。

まとめ

  • データ型を修正したい時は、現在のmapping情報をコピーして必要箇所を変更して貼り付けると楽ちん
  • もちろんコピーしないで、必要なフィールドの型を定義してもOK(でもコピペなら文法覚えなくてもできる)
  • reindexAPIを使ったりする方法もある
  • kibanaから参照する場合は、index patternのrefreshをお忘れなく