30
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Elasticsearch から type が無くなる

Posted at

Elasticsearch の勉強を兼ねて、アプリを開発しています。今はちょっとした機能を追加しようと思いあれこれ考えていますが、既存のデータ構造をうまく拡張できずに悶々としていました。

そんな折、たまたま見かけた以下の記事に、Elasticsearch 6 では「_type は Deprecared」と書いてあり、びっくりしました。なぜなら、私が作った index には _type が3つあり、なおかつそのうち2つを parent-child の構造にしていたからです。

これでは間違いなくES7の時代には移行できなくなると思い、対策を調べてみました。

type を引退させる理由として、上記の記事で挙げられているのが、Elasticsearch の type に関する誤解です。

In an Elasticsearch index, fields that have the same name in different mapping types are backed by the same Lucene field internally

ということで、異なる type であったとしても、内部では同じ Lucene フィールドが使われるので、type 毎に field の型を変えたりすることはできません。

また、

On top of that, storing different entities that have few or no fields in common in the same index leads to sparse data and interferes with Lucene’s ability to compress documents efficiently.

共通項目の少ないデータを同じインデックスに入れると、Lucene のドキュメント圧縮が効率的に働かないそうです。
なんだか知らない事ばかりで、とても勉強になりました。

では、どうするかというと、一つの index には 一つの type のみ使うようにすればいいです。
これまで _type を使っていた部分は、自分で type を定義すれば同様のことができます。reindex APIを使った例が、上記のページに書いてあります。

そんなわけで、自分のアプリのデータ設計を根本から見直そうと思います。「index の type は一つだけ」の縛りにすると、むしろ設計がシンプルになって、道がパッと開けたような気がしました。ビジネス要件を index の構造に反映させるのではなく、そこは Elasticsearch の様々な検索機能にやらせればいいと思いました。それこそまさに Elasticsearch の得意な分野だと思うので。

30
17
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
30
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?