バージョン6系への移行について


(Skane) #1

Elasticsearch6系を使用した場合のIndexの扱いについて困ったことが出て来ました。
現状、Elasticsearch5.6系を使用しておりまして、今後6の最新バージョンに移行を検討している段階でおります。

そのときに懸念事項が出てきてしまいまして、
6系以降からtypeの概念をなくそうとしているとのことですが、
現状、色々なフィールドを自由に組み合わせてmapping定義が追加されていくようなサービスを使っておりまして、
mapping定義が今後数千に増えていく可能性が出てきてしまいました。
それに伴い6系に移行したときIndexの数も数千になってしまうのではと懸念しております。
メモリを増やすか、ノード数を増やすといった対応方法があるかもしれませんが、コストに見合ったサービス提供ができなくなってしまいます。
mapping定義が数千個になってもサービス提供ができるよい方法は何かあるのでしょうか?
それともmapping定義が数千になるようなサービスはElasticsearchには向いていないのでしょうか?
ご教授のほどよろしくお願いいたします


(Sunggyu Kei Rhie) #2

現状は同一indexの複数の_typeを指定して使われてたと思われますが、あってますでしょうか?

_typeの概念をなくすだけで、indexやmappingを増やして行く理由はないと思います。
お使いのサービスが運用されてるものかどこかのツール的なものなのかは存じませんが、
基本的に_typeの部分は一つのindexの中でfieldにtypeを区別するfieldを置くことで代替できると思ってます。
クエリで条件として該当のfieldにtermなりを追加する必要はありますが。

mappingを数千持つというのがうまく想像できませんが、
_typeの種類が数千ということでしょうか?


(Skane) #3

ご回答ありがとうございます
説明不足で申し訳ありません

現状は、同一Index内に複数の_typeを指定されており、
5.6のバージョンでこのまま運用し続けた場合、_typeが数千に膨れてくると想像しています


(tsgkdt) #4

こちらはご確認済みでしょうか?

Alternatives to mapping typesで、2通りの代替案が提示されています。

  • Custom type field
  • Index per document type

どのような使われ方をしているか、具体的な例があれば想定しやすいのですが、
同一のindexで異なるTypeでも、同じフィールド名で異なる型は持てないと思いますので、
どんどんmappingが増えていく、ということは無いように見えます。
_typeフィールドに変わる代替のフィールドを用意する @r4-keisuke さんの方法で良さそうに思います。

↓ こういう複数のTypeの利用例ではないと想定(mapping作成時にエラーになる)

index type field
testindex hoge field1 text
testindex bar field1 integer

(Sunggyu Kei Rhie) #5

なるほどですね。
それなら、fieldの数にもよりますが、むしろ良くなりそうなイメージがありますがどうでしょうか。

_typeを使わないで、どんなdocumentなのかだけtype的なfieldを用意しておけば、
type fieldの種別は数千どころか数十万があっても問題はないですよね。
{"type": {"type": "keyword"}}
的な感じで、中身は書きたい放題ですので。

で、実際のindexのmappingとしては上記のtypeとなにかidになりそうなfield以外は、
scheme lessを生かして入れたいものはmapping意識せずにid, type fieldだけ守りながら入れてしまえば、
実質一つのindexの中にたくさんの種類のdocumentが共存可能になります。

fieldの組み合わせのパターン数が数千に行く形だと思うのでfield数もかなり多いと思いますが、
多分一つのindexで1000fieldまでがデフォルトだったような気がしますし。

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping.html#mapping-limit-settings

ここにはそう書いてありますね。参考にしてくださいー


(Skane) #6

@r4-keisuke さん @tsgkdt さんご回答ありがとうございました。
色々理解が足らず申し訳ございませんした。
おそらく下記のようにしておけば問題ないということが理解できました。

現バージョン5.6

{
  "index_name"
    "mappings" : {
      "type_A" : {
        "properties" : {
          "name" : {"type" : "text"},
          "age" : {"type" : "integer"},
           ...
        },
       "type_B" : {
         "properties" : {
           "name" : {"type" : "text"},
           "picture" : {"type" : "text"},
           ...
        },
        ...
}

バージョン6以降

{
  "mappings": {
    "doc": {
      "properties": {
        "type": { "type": "keyword" },
        "name": { "type": "text" },
        "age": { "type": "integer" },
        "picture" : {"type" : "text"},
        ...
      }
    }
}

また、フィールドの数だけ1,000を超えないように気をつけて、超える場合は別のIndexを利用するようにしたいと思っています。
ありがとうございました


(system) closed #7

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.