2013-05-23 23 views
12

私は有限の値しか持てないフィールドがあるとします。 ENUMのようなものを格納する方が効率的(索引的にもストレージ的にも)ではないでしょうか?弾性検索列挙型フィールド

elasticsearchにこのような可能性はありますか?

例としては、ステートマシン内の状態の名前があります。

+0

列挙型の一部ではない値を入力しようとすると型制約が壊れた場合、ENUM型はエラーを投げる必要はありませんか? – LeeGee

答えて

13

はい、そうです。フルテキストフィールドのインデックスを作成すると、フィールドの長さ、フィールド内の各用語の位置や頻度などの情報もインデックスに登録されます。

これらはENUM値とは無関係であり、完全に除外することができます。実際に

、その後、{"index": "not_analyzed"}あなたマップあなたのフィールド場合は、あなたがそれを分析しようとせずに提供し、正確な値を格納するほか、それはまた、私は上記の余分な情報の保存を無効にします。

+0

ええ、私はあなたが言っていることを知っています。しかし、私はさらにデータを減らしたいと思っています。フィールドに3つの値のうちの1つがありますが、値が非常に長い文字列の場合、それらを何度も格納することは、たとえ "分析されていなくても"残念です。 さらに、そのフィールドの可能な値を制限したいと思います。 – eran

+4

はい、いいえ。まず、索引では、各ストリングは1回だけ保管されます。それは、逆インデックスがどのように機能するかです。あなたは「用語」を持っています:[用語を含む文書のリスト]。値は_sourceフィールド内に繰り返し表示されますが、自動的に圧縮されるため、予想通り大きな影響を与えることはありません。 – DrTech

+2

明確にする:LONGNAME - > ENUMマッピングをやりたい場合は、アプリケーションでそれを行わなければなりません。 – DrTech

2

アプリでは、ハッシュマップ{ "enumVal1" => 1, "enumVal2" => 2, "enumValX" => 3 }を使用してから、ESでhashmapの値のみを使用すると、これで領域を節約できます。