Elasticsearch 1.x から 6.x へ upgrade する際の text/keyword(analyzed/not_analyzed) の共存方法


(安藤真輝) #1

今までバージョン1.xを使用していましたが、バージョン6.4にアップデートする予定です。
現在このアップデートの作業中で、index templateを作成する際に、
1.xのバージョンのindex templateがそのままでは使えないため、
貴社のドキュメントを確認ながらstringをtextやkeywordに置き換えたりしてアップデート作業を進めているのですが、
単純にstringをtextやkeywordに置き換えるだけではなくて、
他にもelasticsearchのバージョンアップに伴って統廃合された機能があるようなので、
今回このような形で質問させていただきました。
例えば、バージョン1.xでは以下のようなindex templateが作成することで、 analyzed/not_analyzed が共存できました。

"field_name": {
  "index" : "analyzed",
  "type" : "string",
  "fields" : {
    "full" : {
      "index" : "not_analyzed",
      "type" : "string" 
    }
  }
}

バージョン6.xでは string 型のanalyzed/not_analyzed はそれぞれ text/keyword 型に置き換わったそうですが、バージョン6.xでこのtext/keyword 型が共存するフィールドは作成可能でしょうか?
また、バージョン1.xからバージョン6.xに移行するにあたり、自動でindex templateを変換してくれるサービスはないのか教えていただきたいです。


(tsgkdt) #2

ご認識の通り、stringはtext( analyzeされるもの)、keyword(されないもの)に代わっています。

例えば
field_nameをkuromojiでanalyzedしたものを格納し、
field_name.keywordには、analyzedしないものを格納するようなイメージの場合は、以下のようになるかと思います。

"field_name": {
  "analyzer" : "kuromoji_analyzer",
  "type" : "text",
  "fields" : {
    "keyword" : {
       "type" : "keyword",
       "ignore_above" : 256
    }
  }
}

(analyzerでkuromojiを指定していますが、読みかえてください)

移行に関しては、アップグレードガイドが提供されていますが、さすがに1.xは古すぎて載ってませんでした。
https://www.elastic.co/products/upgrade_guide

Breaking Changeを追って理解していく必要があるんじゃないかと予想します。


(安藤真輝) #3

お返事ありがとうございます。
kuromoji_analyzer のようなanalyzerの指定が必要になるとは今回初めて知りました。
確かにに1.xは古すぎて中々検索しても出てこないので、苦労しました。
早速、試してみようと思います。


(tsgkdt) #4

analyzerは必須項目ではないので、指定しないこともできます。
なので、こういう形でも定義はできます。

"field_name": {
  "type" : "text",
  "fields" : {
    "keyword" : {
       "type" : "keyword",
       "ignore_above" : 256
    }
  }
}

その場合は、indexのデフォルトにされているものか、standardになるみたいですね。
https://www.elastic.co/guide/en/elasticsearch/reference/6.5/analyzer.html

フィールドの中に入るデータ、値と、それをどのようにanalyzeしたいのかによって、適切に選んでいただければよいと思います。


(安藤真輝) #5

色々とありがとうございます。
実際に試してみて適切なものを選ぼうと思います。