数値フィールドタイプ
次の数値タイプがサポートされています:
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
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"number_of_bytes": {
"type": "integer"
},
"time_in_seconds": {
"type": "float"
},
"price": {
"type": "scaled_float",
"scaling_factor": 100
}
}
},
)
print(resp)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
number_of_bytes: {
type: 'integer'
},
time_in_seconds: {
type: 'float'
},
price: {
type: 'scaled_float',
scaling_factor: 100
}
}
}
}
)
puts response
Go
res, err := es.Indices.Create(
"my-index-000001",
es.Indices.Create.WithBody(strings.NewReader(`{
"mappings": {
"properties": {
"number_of_bytes": {
"type": "integer"
},
"time_in_seconds": {
"type": "float"
},
"price": {
"type": "scaled_float",
"scaling_factor": 100
}
}
}
}`)),
)
fmt.Println(res, err)
Js
const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
number_of_bytes: {
type: "integer",
},
time_in_seconds: {
type: "float",
},
price: {
type: "scaled_float",
scaling_factor: 100,
},
},
},
});
console.log(response);
コンソール
PUT my-index-000001
{
"mappings": {
"properties": {
"number_of_bytes": {
"type": "integer"
},
"time_in_seconds": {
"type": "float"
},
"price": {
"type": "scaled_float",
"scaling_factor": 100
}
}
}
}
double
、float
、half_float
タイプは、-0.0
と +0.0
が異なる値であると考えます。その結果、term
クエリを -0.0
に対して実行しても +0.0
に一致せず、その逆も同様です。範囲クエリについても同様です: 上限が -0.0
の場合、+0.0
は一致せず、下限が +0.0
の場合、-0.0
は一致しません。
どのタイプを使用すべきか?
整数タイプ(byte
、short
、integer
、long
)に関しては、使用ケースに十分な最小のタイプを選択するべきです。これにより、インデックス作成と検索がより効率的になります。ただし、ストレージは実際に保存される値に基づいて最適化されるため、あるタイプを選ぶことがストレージ要件に影響を与えることはありません。
浮動小数点タイプの場合、スケーリングファクターを使用して浮動小数点データを整数に保存する方が効率的なことが多く、これは scaled_float
タイプが内部で行うことです。たとえば、price
フィールドは、scaled_float
に scaling_factor
の 100
を持つ形で保存される可能性があります。すべてのAPIは、フィールドがダブルとして保存されているかのように動作しますが、内部ではElasticsearchはセントの数、price*100
、すなわち整数として処理します。これは、整数が浮動小数点よりも圧縮しやすいため、ディスクスペースを節約するのに役立ちます。scaled_float
を使用して、精度をディスクスペースと交換することも問題ありません。たとえば、CPU使用率を 0
と 1
の間の数値として追跡していると想像してください。CPU使用率が 12.7%
であるか 13%
であるかはあまり重要ではないため、scaled_float
を使用してCPU使用率を最も近いパーセントに丸めてスペースを節約することができます。
scaled_float
が適切でない場合は、浮動小数点タイプの中で使用ケースに十分な最小のタイプを選択するべきです: double
、float
、half_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は、integer
や long
のような数値フィールドを 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
でなければなりません。- フィールド値は 配列またはマルチバリュー であってはなりません。
数値フィールドタイプの中で、byte
、short
、integer
、long
、unsigned_long
フィールドのみがこのパラメータをサポートします。
数値フィールドは、時系列次元と時系列メトリックの両方であることはできません。
time_series_metric
- (オプション、文字列)フィールドを 時系列メトリック としてマークします。値はメトリックタイプです。このパラメータを既存のフィールドに対して更新することはできません。
数値フィールドの有効なtime_series_metric
値counter
- 単調に増加するか、
0
(ゼロ)にリセットされる累積メトリック。たとえば、エラーのカウントや完了したタスクの数。 gauge
- 任意に増加または減少できる単一の数値を表すメトリック。たとえば、温度や利用可能なディスクスペース。
null
(デフォルト)- 時系列メトリックではありません。
数値時系列メトリックの場合、doc_values
パラメータはtrue
でなければなりません。数値フィールドは、時系列次元と時系列メトリックの両方であることはできません。
scaled_floatのパラメータ
scaled_float
は追加のパラメータを受け入れます:
scaling_factor |
値をエンコードする際に使用するスケーリングファクター。値はインデックス時にこのファクターで乗算され、最も近い長整数値に丸められます。たとえば、scaled_float が scaling_factor の 10 を持つ場合、内部的に 2.34 を 23 として保存し、すべての検索時操作(クエリ、集計、ソート)は、ドキュメントが 2.3 の値を持っているかのように動作します。scaling_factor の高い値は精度を向上させますが、スペース要件も増加させます。このパラメータは必須です。 |
scaled_floatの飽和
scaled_float
は単一の long
値として保存され、これは元の値をスケーリングファクターで乗算した結果です。乗算の結果が long
の範囲外の値になると、その値は long
の最小値または最大値に飽和されます。たとえば、スケーリングファクターが 100
で値が 92233720368547758.08
の場合、期待される値は 9223372036854775808
です。しかし、保存される値は 9223372036854775807
で、long
の最大値です。
これは、スケーリングファクターまたは提供された float
値が非常に大きい場合に、範囲クエリ で予期しない結果を引き起こす可能性があります。
合成 _source
合成 _source
は、一般的にTSDBインデックス(index.mode
が time_series
に設定されているインデックス)のみで利用可能です。他のインデックスでは、合成 _source
は技術プレビュー中です。技術プレビューの機能は、将来のリリースで変更または削除される可能性があります。Elasticは問題を修正するために作業しますが、技術プレビューの機能は公式GA機能のサポートSLAの対象ではありません。
すべての数値フィールドは、デフォルト設定で 合成 _source
をサポートします。合成 _source
は、copy_to
と一緒に使用することはできず、doc_values
が無効になっている場合も使用できません。
合成ソースは常に数値フィールドをソートします。たとえば:
Python
resp = client.indices.create(
index="idx",
mappings={
"_source": {
"mode": "synthetic"
},
"properties": {
"long": {
"type": "long"
}
}
},
)
print(resp)
resp1 = client.index(
index="idx",
id="1",
document={
"long": [
0,
0,
-123466,
87612
]
},
)
print(resp1)
Ruby
response = client.indices.create(
index: 'idx',
body: {
mappings: {
_source: {
mode: 'synthetic'
},
properties: {
long: {
type: 'long'
}
}
}
}
)
puts response
response = client.index(
index: 'idx',
id: 1,
body: {
long: [
0,
0,
-123_466,
87_612
]
}
)
puts response
Js
const response = await client.indices.create({
index: "idx",
mappings: {
_source: {
mode: "synthetic",
},
properties: {
long: {
type: "long",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "idx",
id: 1,
document: {
long: [0, 0, -123466, 87612],
},
});
console.log(response1);
コンソール
PUT idx
{
"mappings": {
"_source": { "mode": "synthetic" },
"properties": {
"long": { "type": "long" }
}
}
}
PUT idx/_doc/1
{
"long": [0, 0, -123466, 87612]
}
コンソール-結果
{
"long": [-123466, 0, 0, 87612]
}
スケールされた浮動小数点は常にそのスケーリングファクターを適用しますので:
Python
resp = client.indices.create(
index="idx",
mappings={
"_source": {
"mode": "synthetic"
},
"properties": {
"f": {
"type": "scaled_float",
"scaling_factor": 0.01
}
}
},
)
print(resp)
resp1 = client.index(
index="idx",
id="1",
document={
"f": 123
},
)
print(resp1)
Ruby
response = client.indices.create(
index: 'idx',
body: {
mappings: {
_source: {
mode: 'synthetic'
},
properties: {
f: {
type: 'scaled_float',
scaling_factor: 0.01
}
}
}
}
)
puts response
response = client.index(
index: 'idx',
id: 1,
body: {
f: 123
}
)
puts response
Js
const response = await client.indices.create({
index: "idx",
mappings: {
_source: {
mode: "synthetic",
},
properties: {
f: {
type: "scaled_float",
scaling_factor: 0.01,
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "idx",
id: 1,
document: {
f: 123,
},
});
console.log(response1);
コンソール
PUT idx
{
"mappings": {
"_source": { "mode": "synthetic" },
"properties": {
"f": { "type": "scaled_float", "scaling_factor": 0.01 }
}
}
}
PUT idx/_doc/1
{
"f": 123
}
コンソール-結果
{
"f": 100.0
}