数値フィールドタイプ

次の数値タイプがサポートされています:

long 最小値が -263 で最大値が 263-1 の符号付き64ビット整数。
integer 最小値が -231 で最大値が 231-1 の符号付き32ビット整数。
short 最小値が -32,768 で最大値が 32,767 の符号付き16ビット整数。
byte 最小値が -128 で最大値が 127 の符号付き8ビット整数。
double 有限値に制限された倍精度64ビットIEEE 754浮動小数点数。
float 有限値に制限された単精度32ビットIEEE 754浮動小数点数。
half_float 有限値に制限された半精度16ビットIEEE 754浮動小数点数。
scaled_float 固定の double スケーリングファクターでスケーリングされた long に基づく浮動小数点数。
unsigned_long 最小値が0で最大値が 264-1 の符号なし64ビット整数。

以下は数値フィールドを使用してマッピングを構成する例です:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "properties": {
  5. "number_of_bytes": {
  6. "type": "integer"
  7. },
  8. "time_in_seconds": {
  9. "type": "float"
  10. },
  11. "price": {
  12. "type": "scaled_float",
  13. "scaling_factor": 100
  14. }
  15. }
  16. },
  17. )
  18. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. properties: {
  6. number_of_bytes: {
  7. type: 'integer'
  8. },
  9. time_in_seconds: {
  10. type: 'float'
  11. },
  12. price: {
  13. type: 'scaled_float',
  14. scaling_factor: 100
  15. }
  16. }
  17. }
  18. }
  19. )
  20. puts response

Go

  1. res, err := es.Indices.Create(
  2. "my-index-000001",
  3. es.Indices.Create.WithBody(strings.NewReader(`{
  4. "mappings": {
  5. "properties": {
  6. "number_of_bytes": {
  7. "type": "integer"
  8. },
  9. "time_in_seconds": {
  10. "type": "float"
  11. },
  12. "price": {
  13. "type": "scaled_float",
  14. "scaling_factor": 100
  15. }
  16. }
  17. }
  18. }`)),
  19. )
  20. fmt.Println(res, err)

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. properties: {
  5. number_of_bytes: {
  6. type: "integer",
  7. },
  8. time_in_seconds: {
  9. type: "float",
  10. },
  11. price: {
  12. type: "scaled_float",
  13. scaling_factor: 100,
  14. },
  15. },
  16. },
  17. });
  18. console.log(response);

コンソール

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "properties": {
  5. "number_of_bytes": {
  6. "type": "integer"
  7. },
  8. "time_in_seconds": {
  9. "type": "float"
  10. },
  11. "price": {
  12. "type": "scaled_float",
  13. "scaling_factor": 100
  14. }
  15. }
  16. }
  17. }

doublefloathalf_float タイプは、-0.0+0.0 が異なる値であると考えます。その結果、term クエリを -0.0 に対して実行しても +0.0 に一致せず、その逆も同様です。範囲クエリについても同様です: 上限が -0.0 の場合、+0.0 は一致せず、下限が +0.0 の場合、-0.0 は一致しません。

どのタイプを使用すべきか?

整数タイプ(byteshortintegerlong)に関しては、使用ケースに十分な最小のタイプを選択するべきです。これにより、インデックス作成と検索がより効率的になります。ただし、ストレージは実際に保存される値に基づいて最適化されるため、あるタイプを選ぶことがストレージ要件に影響を与えることはありません。

浮動小数点タイプの場合、スケーリングファクターを使用して浮動小数点データを整数に保存する方が効率的なことが多く、これは scaled_float タイプが内部で行うことです。たとえば、price フィールドは、scaled_floatscaling_factor100 を持つ形で保存される可能性があります。すべてのAPIは、フィールドがダブルとして保存されているかのように動作しますが、内部ではElasticsearchはセントの数、price*100、すなわち整数として処理します。これは、整数が浮動小数点よりも圧縮しやすいため、ディスクスペースを節約するのに役立ちます。scaled_float を使用して、精度をディスクスペースと交換することも問題ありません。たとえば、CPU使用率を 01 の間の数値として追跡していると想像してください。CPU使用率が 12.7% であるか 13% であるかはあまり重要ではないため、scaled_float を使用してCPU使用率を最も近いパーセントに丸めてスペースを節約することができます。

scaled_float が適切でない場合は、浮動小数点タイプの中で使用ケースに十分な最小のタイプを選択するべきです: doublefloathalf_float。以下は、これらのタイプを比較する表です。

タイプ 最小値 最大値 有意な
ビット / 桁
例の精度損失
double 2-1074 (2-2-52)·21023 53 / 15.95 1.2345678912345678
1.234567891234568
float 2-149 (2-2-23)·2127 24 / 7.22 1.23456789
1.2345679
half_float 2-24 65504 11 / 3.31 1.2345
1.234375

数値識別子のマッピング

すべての数値データを 数値 フィールドデータタイプとしてマッピングするべきではありません。Elasticsearchは、integerlong のような数値フィールドを range クエリ用に最適化します。しかし、keyword フィールドは、term や他の タームレベル クエリに対してより適しています。

ISBNや製品IDのような識別子は、range クエリで使用されることはほとんどありません。しかし、タームレベルのクエリを使用して取得されることがよくあります。

識別子データを range クエリを使用して検索する予定がない場合、迅速な取得が重要である場合は、keyword として数値識別子をマッピングすることを検討してください。term クエリは、keyword フィールドに対しての検索が、数値フィールドに対する term 検索よりも速いことがよくあります。

どちらを使用すべきか不明な場合は、データを keyword および 数値データタイプとしてマッピングするために マルチフィールド を使用できます。

数値フィールドのパラメータ

次のパラメータは数値タイプで受け入れられます:

  • coerce
  • 文字列を数値に変換し、整数のために小数を切り捨てることを試みます。true(デフォルト)および false を受け入れます。unsigned_long には適用されません。script パラメータが使用されている場合、これは設定できないことに注意してください。
  • doc_values
  • フィールドは、ディスクに列ストライド方式で保存され、後でソート、集計、またはスクリプトに使用されるべきですか?true(デフォルト)または false を受け入れます。
  • ignore_malformed
  • true の場合、無効な数値は無視されます。false(デフォルト)の場合、無効な数値は例外をスローし、ドキュメント全体を拒否します。script パラメータが使用されている場合、これは設定できないことに注意してください。
  • index
  • フィールドは迅速に検索可能であるべきですか?true(デフォルト)および false を受け入れます。doc_values のみが有効な数値フィールドもクエリ可能ですが、遅くなります。
  • meta
  • フィールドに関するメタデータ。
  • null_value
  • フィールドと同じ type の数値値を受け入れ、明示的な null 値の代わりに置き換えられます。デフォルトは null で、これはフィールドが欠落していると見なされることを意味します。script パラメータが使用されている場合、これは設定できないことに注意してください。
  • on_script_error
  • インデックス時に script パラメータによって定義されたスクリプトがエラーをスローした場合に何をするかを定義します。fail(デフォルト)を受け入れ、これによりドキュメント全体が拒否され、continue により、ドキュメントの _ignored メタデータフィールドにフィールドが登録され、インデックス作成が続行されます。このパラメータは、script フィールドが設定されている場合にのみ設定できます。
  • script
  • このパラメータが設定されている場合、フィールドはこのスクリプトによって生成された値をインデックスし、ソースから直接値を読み取るのではなくなります。このフィールドに入力ドキュメントで値が設定されている場合、ドキュメントはエラーで拒否されます。スクリプトはその ランタイム相当 と同じ形式です。スクリプトは long および double フィールドタイプにのみ設定できます。
  • store
  • フィールド値は、_source フィールドとは別に保存され、取得可能であるべきですか?true または false(デフォルト)を受け入れます。
  • time_series_dimension
  • (オプション、ブール値)
    フィールドを 時系列次元 としてマークします。デフォルトは false です。
    index.mapping.dimension_fields.limit インデックス設定は、インデックス内の次元の数を制限します。
    次元フィールドには次の制約があります:
    • doc_values および index マッピングパラメータは true でなければなりません。
    • フィールド値は 配列またはマルチバリュー であってはなりません。
      数値フィールドタイプの中で、byteshortintegerlongunsigned_long フィールドのみがこのパラメータをサポートします。
      数値フィールドは、時系列次元と時系列メトリックの両方であることはできません。
  • time_series_metric
  • (オプション、文字列)フィールドを 時系列メトリック としてマークします。値はメトリックタイプです。このパラメータを既存のフィールドに対して更新することはできません。
    数値フィールドの有効な time_series_metric
    • counter
    • 単調に増加するか、0(ゼロ)にリセットされる累積メトリック。たとえば、エラーのカウントや完了したタスクの数。
    • gauge
    • 任意に増加または減少できる単一の数値を表すメトリック。たとえば、温度や利用可能なディスクスペース。
    • null(デフォルト)
    • 時系列メトリックではありません。
      数値時系列メトリックの場合、doc_values パラメータは true でなければなりません。数値フィールドは、時系列次元と時系列メトリックの両方であることはできません。

scaled_floatのパラメータ

scaled_float は追加のパラメータを受け入れます:

scaling_factor 値をエンコードする際に使用するスケーリングファクター。値はインデックス時にこのファクターで乗算され、最も近い長整数値に丸められます。たとえば、scaled_floatscaling_factor10 を持つ場合、内部的に 2.3423 として保存し、すべての検索時操作(クエリ、集計、ソート)は、ドキュメントが 2.3 の値を持っているかのように動作します。scaling_factor の高い値は精度を向上させますが、スペース要件も増加させます。このパラメータは必須です。

scaled_floatの飽和

scaled_float は単一の long 値として保存され、これは元の値をスケーリングファクターで乗算した結果です。乗算の結果が long の範囲外の値になると、その値は long の最小値または最大値に飽和されます。たとえば、スケーリングファクターが 100 で値が 92233720368547758.08 の場合、期待される値は 9223372036854775808 です。しかし、保存される値は 9223372036854775807 で、long の最大値です。

これは、スケーリングファクターまたは提供された float 値が非常に大きい場合に、範囲クエリ で予期しない結果を引き起こす可能性があります。

合成 _source

合成 _source は、一般的にTSDBインデックス(index.modetime_series に設定されているインデックス)のみで利用可能です。他のインデックスでは、合成 _source は技術プレビュー中です。技術プレビューの機能は、将来のリリースで変更または削除される可能性があります。Elasticは問題を修正するために作業しますが、技術プレビューの機能は公式GA機能のサポートSLAの対象ではありません。

すべての数値フィールドは、デフォルト設定で 合成 _source をサポートします。合成 _source は、copy_to と一緒に使用することはできず、doc_values が無効になっている場合も使用できません。

合成ソースは常に数値フィールドをソートします。たとえば:

Python

  1. resp = client.indices.create(
  2. index="idx",
  3. mappings={
  4. "_source": {
  5. "mode": "synthetic"
  6. },
  7. "properties": {
  8. "long": {
  9. "type": "long"
  10. }
  11. }
  12. },
  13. )
  14. print(resp)
  15. resp1 = client.index(
  16. index="idx",
  17. id="1",
  18. document={
  19. "long": [
  20. 0,
  21. 0,
  22. -123466,
  23. 87612
  24. ]
  25. },
  26. )
  27. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'idx',
  3. body: {
  4. mappings: {
  5. _source: {
  6. mode: 'synthetic'
  7. },
  8. properties: {
  9. long: {
  10. type: 'long'
  11. }
  12. }
  13. }
  14. }
  15. )
  16. puts response
  17. response = client.index(
  18. index: 'idx',
  19. id: 1,
  20. body: {
  21. long: [
  22. 0,
  23. 0,
  24. -123_466,
  25. 87_612
  26. ]
  27. }
  28. )
  29. puts response

Js

  1. const response = await client.indices.create({
  2. index: "idx",
  3. mappings: {
  4. _source: {
  5. mode: "synthetic",
  6. },
  7. properties: {
  8. long: {
  9. type: "long",
  10. },
  11. },
  12. },
  13. });
  14. console.log(response);
  15. const response1 = await client.index({
  16. index: "idx",
  17. id: 1,
  18. document: {
  19. long: [0, 0, -123466, 87612],
  20. },
  21. });
  22. console.log(response1);

コンソール

  1. PUT idx
  2. {
  3. "mappings": {
  4. "_source": { "mode": "synthetic" },
  5. "properties": {
  6. "long": { "type": "long" }
  7. }
  8. }
  9. }
  10. PUT idx/_doc/1
  11. {
  12. "long": [0, 0, -123466, 87612]
  13. }

次のようになります:

コンソール-結果

  1. {
  2. "long": [-123466, 0, 0, 87612]
  3. }

スケールされた浮動小数点は常にそのスケーリングファクターを適用しますので:

Python

  1. resp = client.indices.create(
  2. index="idx",
  3. mappings={
  4. "_source": {
  5. "mode": "synthetic"
  6. },
  7. "properties": {
  8. "f": {
  9. "type": "scaled_float",
  10. "scaling_factor": 0.01
  11. }
  12. }
  13. },
  14. )
  15. print(resp)
  16. resp1 = client.index(
  17. index="idx",
  18. id="1",
  19. document={
  20. "f": 123
  21. },
  22. )
  23. print(resp1)

Ruby

  1. response = client.indices.create(
  2. index: 'idx',
  3. body: {
  4. mappings: {
  5. _source: {
  6. mode: 'synthetic'
  7. },
  8. properties: {
  9. f: {
  10. type: 'scaled_float',
  11. scaling_factor: 0.01
  12. }
  13. }
  14. }
  15. }
  16. )
  17. puts response
  18. response = client.index(
  19. index: 'idx',
  20. id: 1,
  21. body: {
  22. f: 123
  23. }
  24. )
  25. puts response

Js

  1. const response = await client.indices.create({
  2. index: "idx",
  3. mappings: {
  4. _source: {
  5. mode: "synthetic",
  6. },
  7. properties: {
  8. f: {
  9. type: "scaled_float",
  10. scaling_factor: 0.01,
  11. },
  12. },
  13. },
  14. });
  15. console.log(response);
  16. const response1 = await client.index({
  17. index: "idx",
  18. id: 1,
  19. document: {
  20. f: 123,
  21. },
  22. });
  23. console.log(response1);

コンソール

  1. PUT idx
  2. {
  3. "mappings": {
  4. "_source": { "mode": "synthetic" },
  5. "properties": {
  6. "f": { "type": "scaled_float", "scaling_factor": 0.01 }
  7. }
  8. }
  9. }
  10. PUT idx/_doc/1
  11. {
  12. "f": 123
  13. }

次のようになります:

コンソール-結果

  1. {
  2. "f": 100.0
  3. }