日付フィールドタイプ
JSONには日付データ型がないため、Elasticsearchの日時は次のいずれかになります:
- フォーマットされた日付を含む文字列、例:
"2015-01-01"
または"2015/01/01 12:10:30"
。 - エポックからのミリ秒を表す数値。
- エポックからの秒を表す数値(設定)。
内部的には、日付はUTCに変換され(タイムゾーンが指定されている場合)、エポックからのミリ秒を表す長い数値として保存されます。
ナノ秒の解像度が期待される場合は、date_nanosフィールドタイプを使用してください。
日付に対するクエリは、内部的にこの長い表現に対する範囲クエリに変換され、集約の結果や保存されたフィールドは、フィールドに関連付けられた日付フォーマットに応じて文字列に戻されます。
日付は常に文字列として表示されます。たとえ最初にJSONドキュメントで長い数値として提供されていた場合でもです。
日付フォーマットはカスタマイズ可能ですが、format
が指定されていない場合はデフォルトが使用されます:
Js
"strict_date_optional_time||epoch_millis"
これは、strict_date_optional_time
でサポートされているフォーマットまたはエポックからのミリ秒に準拠したオプションのタイムスタンプを持つ日付を受け入れることを意味します。
例えば:
Python
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"date": {
"type": "date"
}
}
},
)
print(resp)
resp1 = client.index(
index="my-index-000001",
id="1",
document={
"date": "2015-01-01"
},
)
print(resp1)
resp2 = client.index(
index="my-index-000001",
id="2",
document={
"date": "2015-01-01T12:10:30Z"
},
)
print(resp2)
resp3 = client.index(
index="my-index-000001",
id="3",
document={
"date": 1420070400001
},
)
print(resp3)
resp4 = client.search(
index="my-index-000001",
sort={
"date": "asc"
},
)
print(resp4)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
date: {
type: 'date'
}
}
}
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 1,
body: {
date: '2015-01-01'
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 2,
body: {
date: '2015-01-01T12:10:30Z'
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 3,
body: {
date: 1_420_070_400_001
}
)
puts response
response = client.search(
index: 'my-index-000001',
body: {
sort: {
date: 'asc'
}
}
)
puts response
Go
{
res, err := es.Indices.Create(
"my-index-000001",
es.Indices.Create.WithBody(strings.NewReader(`{
"mappings": {
"properties": {
"date": {
"type": "date"
}
}
}
}`)),
)
fmt.Println(res, err)
}
{
res, err := es.Index(
"my-index-000001",
strings.NewReader(`{
"date": "2015-01-01"
} `),
es.Index.WithDocumentID("1"),
es.Index.WithPretty(),
)
fmt.Println(res, err)
}
{
res, err := es.Index(
"my-index-000001",
strings.NewReader(`{
"date": "2015-01-01T12:10:30Z"
} `),
es.Index.WithDocumentID("2"),
es.Index.WithPretty(),
)
fmt.Println(res, err)
}
{
res, err := es.Index(
"my-index-000001",
strings.NewReader(`{
"date": 1420070400001
} `),
es.Index.WithDocumentID("3"),
es.Index.WithPretty(),
)
fmt.Println(res, err)
}
{
res, err := es.Search(
es.Search.WithIndex("my-index-000001"),
es.Search.WithBody(strings.NewReader(`{
"sort": {
"date": "asc"
}
}`)),
es.Search.WithPretty(),
)
fmt.Println(res, err)
}
Js
const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
date: {
type: "date",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "my-index-000001",
id: 1,
document: {
date: "2015-01-01",
},
});
console.log(response1);
const response2 = await client.index({
index: "my-index-000001",
id: 2,
document: {
date: "2015-01-01T12:10:30Z",
},
});
console.log(response2);
const response3 = await client.index({
index: "my-index-000001",
id: 3,
document: {
date: 1420070400001,
},
});
console.log(response3);
const response4 = await client.search({
index: "my-index-000001",
sort: {
date: "asc",
},
});
console.log(response4);
コンソール
PUT my-index-000001
{
"mappings": {
"properties": {
"date": {
"type": "date"
}
}
}
}
PUT my-index-000001/_doc/1
{ "date": "2015-01-01" }
PUT my-index-000001/_doc/2
{ "date": "2015-01-01T12:10:30Z" }
PUT my-index-000001/_doc/3
{ "date": 1420070400001 }
GET my-index-000001/_search
{
"sort": { "date": "asc"}
}
date フィールドはデフォルトのformat を使用します。 |
|
このドキュメントはプレーンな日付を使用しています。 | |
このドキュメントには時間が含まれています。 | |
このドキュメントはエポックからのミリ秒を使用しています。 | |
返されるsort の値はすべてエポックからのミリ秒です。 |
日付は{"date": 1618249875.123456}
のように小数点を含む数値を受け入れますが、いくつかのケース([#70085](https://github.com/elastic/elasticsearch/issues/70085))では、これらの日付の精度が失われるため、避けるべきです。
複数の日付フォーマット
複数のフォーマットは、||
を区切りとして指定できます。各フォーマットは、マッチするフォーマットが見つかるまで順番に試されます。最初のフォーマットがエポックからのミリ秒値を文字列に戻すために使用されます。
Python
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"date": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
},
)
print(resp)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
date: {
type: 'date',
format: 'yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis'
}
}
}
}
)
puts response
Go
res, err := es.Indices.Create(
"my-index-000001",
es.Indices.Create.WithBody(strings.NewReader(`{
"mappings": {
"properties": {
"date": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}`)),
)
fmt.Println(res, err)
Js
const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
date: {
type: "date",
format: "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis",
},
},
},
});
console.log(response);
コンソール
PUT my-index-000001
{
"mappings": {
"properties": {
"date": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
}
}
}
}
日付フィールドのパラメータ
次のパラメータはdate
フィールドで受け入れられます:
doc_values |
フィールドはディスクにカラムストライド方式で保存され、後でソート、集計、またはスクリプトに使用されるべきですか?true (デフォルト)またはfalse を受け入れます。 |
||
format |
解析可能な日付フォーマット。デフォルトは`````strict_date_optional_time | epoch_millis`````です。 | |
locale |
日付を解析する際に使用するロケール。月の名前や略称はすべての言語で同じではないため。デフォルトはROOT ロケールです。 |
||
ignore_malformed |
true の場合、誤った数値は無視されます。false (デフォルト)の場合、誤った数値は例外をスローし、ドキュメント全体を拒否します。このパラメータがscript パラメータが使用されている場合は設定できません。 |
||
index |
フィールドは迅速に検索可能であるべきですか?true (デフォルト)およびfalse を受け入れます。doc_values が有効な日付フィールドもクエリ可能ですが、遅くなります。 |
||
null_value |
フィールドの明示的なnull 値の代わりに、設定されたformat の1つの日時値を受け入れます。デフォルトはnull で、これはフィールドが欠落していると見なされます。このパラメータがscript パラメータが使用されている場合は設定できません。 |
||
on_script_error |
script パラメータによって定義されたスクリプトがインデックス作成時にエラーをスローした場合の処理方法を定義します。fail (デフォルト)を受け入れ、これによりドキュメント全体が拒否され、continue は、ドキュメントの_ignored メタデータフィールドにフィールドを登録し、インデックス作成を続行します。このパラメータはscript フィールドが設定されている場合にのみ設定できます。 |
||
script |
このパラメータが設定されている場合、フィールドはこのスクリプトによって生成された値をインデックス化し、ソースから直接値を読み取るのではなくなります。このフィールドに入力ドキュメントで値が設定されている場合、ドキュメントはエラーで拒否されます。スクリプトはそのruntime equivalentと同じ形式であり、長い値のタイムスタンプを出力する必要があります。 | ||
store |
フィールド値は_source フィールドから別々に保存および取得可能であるべきですか?true またはfalse (デフォルト)を受け入れます。 |
||
meta |
フィールドに関するメタデータ。 |
エポック秒
日付をエポックからの秒として送信する必要がある場合は、format
がepoch_second
をリストしていることを確認してください:
Python
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"date": {
"type": "date",
"format": "strict_date_optional_time||epoch_second"
}
}
},
)
print(resp)
resp1 = client.index(
index="my-index-000001",
id="example",
refresh=True,
document={
"date": 1618321898
},
)
print(resp1)
resp2 = client.search(
index="my-index-000001",
fields=[
{
"field": "date"
}
],
source=False,
)
print(resp2)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
date: {
type: 'date',
format: 'strict_date_optional_time||epoch_second'
}
}
}
}
)
puts response
response = client.index(
index: 'my-index-000001',
id: 'example',
refresh: true,
body: {
date: 1_618_321_898
}
)
puts response
response = client.search(
index: 'my-index-000001',
body: {
fields: [
{
field: 'date'
}
],
_source: false
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
date: {
type: "date",
format: "strict_date_optional_time||epoch_second",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "my-index-000001",
id: "example",
refresh: "true",
document: {
date: 1618321898,
},
});
console.log(response1);
const response2 = await client.search({
index: "my-index-000001",
fields: [
{
field: "date",
},
],
_source: false,
});
console.log(response2);
コンソール
PUT my-index-000001
{
"mappings": {
"properties": {
"date": {
"type": "date",
"format": "strict_date_optional_time||epoch_second"
}
}
}
}
PUT my-index-000001/_doc/example?refresh
{ "date": 1618321898 }
POST my-index-000001/_search
{
"fields": [ {"field": "date"}],
"_source": false
}
コンソール-結果
{
"hits": {
"hits": [
{
"_id": "example",
"_index": "my-index-000001",
"_score": 1.0,
"fields": {
"date": ["2021-04-13T13:51:38.000Z"]
}
}
]
}
}
合成 _source
合成_source
は、一般的にTSDBインデックス(index.mode
がtime_series
に設定されているインデックス)でのみ利用可能です。他のインデックスでは、合成_source
は技術プレビュー中です。技術プレビューの機能は、将来のリリースで変更または削除される可能性があります。Elasticは問題を修正するために努力しますが、技術プレビューの機能は公式GA機能のサポートSLAの対象ではありません。
合成ソースは常に`````date`````フィールドをソートします。例えば:
#### Python
``````python
resp = client.indices.create(
index="idx",
mappings={
"_source": {
"mode": "synthetic"
},
"properties": {
"date": {
"type": "date"
}
}
},
)
print(resp)
resp1 = client.index(
index="idx",
id="1",
document={
"date": [
"2015-01-01T12:10:30Z",
"2014-01-01T12:10:30Z"
]
},
)
print(resp1)
`
Ruby
response = client.indices.create(
index: 'idx',
body: {
mappings: {
_source: {
mode: 'synthetic'
},
properties: {
date: {
type: 'date'
}
}
}
}
)
puts response
response = client.index(
index: 'idx',
id: 1,
body: {
date: [
'2015-01-01T12:10:30Z',
'2014-01-01T12:10:30Z'
]
}
)
puts response
Js
const response = await client.indices.create({
index: "idx",
mappings: {
_source: {
mode: "synthetic",
},
properties: {
date: {
type: "date",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "idx",
id: 1,
document: {
date: ["2015-01-01T12:10:30Z", "2014-01-01T12:10:30Z"],
},
});
console.log(response1);
コンソール
PUT idx
{
"mappings": {
"_source": { "mode": "synthetic" },
"properties": {
"date": { "type": "date" }
}
}
}
PUT idx/_doc/1
{
"date": ["2015-01-01T12:10:30Z", "2014-01-01T12:10:30Z"]
}
コンソール-結果
{
"date": ["2014-01-01T12:10:30.000Z", "2015-01-01T12:10:30.000Z"]
}