日付ナノ秒フィールドタイプ
このデータタイプは、date
データタイプへの追加です。しかし、二つの間には重要な違いがあります。既存のdate
データタイプは、ミリ秒解像度で日付を保存します。date_nanos
データタイプは、ナノ秒解像度で日付を保存し、エポックからのナノ秒を表すロングとして日付が保存されるため、日付の範囲はおおよそ1970年から2262年までに制限されます。
ナノ秒に関するクエリは、内部的にこのロング表現の範囲クエリに変換され、集約の結果や保存されたフィールドは、フィールドに関連付けられた日付形式に応じて文字列に戻されます。
日付形式はカスタマイズ可能ですが、format
が指定されていない場合は、デフォルトが使用されます:
Js
"strict_date_optional_time_nanos||epoch_millis"
例えば:
Python
resp = client.indices.create(
index="my-index-000001",
mappings={
"properties": {
"date": {
"type": "date_nanos"
}
}
},
)
print(resp)
resp1 = client.bulk(
index="my-index-000001",
refresh=True,
operations=[
{
"index": {
"_id": "1"
}
},
{
"date": "2015-01-01"
},
{
"index": {
"_id": "2"
}
},
{
"date": "2015-01-01T12:10:30.123456789Z"
},
{
"index": {
"_id": "3"
}
},
{
"date": 1420070400000
}
],
)
print(resp1)
resp2 = client.search(
index="my-index-000001",
sort={
"date": "asc"
},
runtime_mappings={
"date_has_nanos": {
"type": "boolean",
"script": "emit(doc['date'].value.nano != 0)"
}
},
fields=[
{
"field": "date",
"format": "strict_date_optional_time_nanos"
},
{
"field": "date_has_nanos"
}
],
)
print(resp2)
Ruby
response = client.indices.create(
index: 'my-index-000001',
body: {
mappings: {
properties: {
date: {
type: 'date_nanos'
}
}
}
}
)
puts response
response = client.bulk(
index: 'my-index-000001',
refresh: true,
body: [
{
index: {
_id: '1'
}
},
{
date: '2015-01-01'
},
{
index: {
_id: '2'
}
},
{
date: '2015-01-01T12:10:30.123456789Z'
},
{
index: {
_id: '3'
}
},
{
date: 1_420_070_400_000
}
]
)
puts response
response = client.search(
index: 'my-index-000001',
body: {
sort: {
date: 'asc'
},
runtime_mappings: {
date_has_nanos: {
type: 'boolean',
script: "emit(doc['date'].value.nano != 0)"
}
},
fields: [
{
field: 'date',
format: 'strict_date_optional_time_nanos'
},
{
field: 'date_has_nanos'
}
]
}
)
puts response
Js
const response = await client.indices.create({
index: "my-index-000001",
mappings: {
properties: {
date: {
type: "date_nanos",
},
},
},
});
console.log(response);
const response1 = await client.bulk({
index: "my-index-000001",
refresh: "true",
operations: [
{
index: {
_id: "1",
},
},
{
date: "2015-01-01",
},
{
index: {
_id: "2",
},
},
{
date: "2015-01-01T12:10:30.123456789Z",
},
{
index: {
_id: "3",
},
},
{
date: 1420070400000,
},
],
});
console.log(response1);
const response2 = await client.search({
index: "my-index-000001",
sort: {
date: "asc",
},
runtime_mappings: {
date_has_nanos: {
type: "boolean",
script: "emit(doc['date'].value.nano != 0)",
},
},
fields: [
{
field: "date",
format: "strict_date_optional_time_nanos",
},
{
field: "date_has_nanos",
},
],
});
console.log(response2);
コンソール
PUT my-index-000001
{
"mappings": {
"properties": {
"date": {
"type": "date_nanos"
}
}
}
}
PUT my-index-000001/_bulk?refresh
{ "index" : { "_id" : "1" } }
{ "date": "2015-01-01" }
{ "index" : { "_id" : "2" } }
{ "date": "2015-01-01T12:10:30.123456789Z" }
{ "index" : { "_id" : "3" } }
{ "date": 1420070400000 }
GET my-index-000001/_search
{
"sort": { "date": "asc"},
"runtime_mappings": {
"date_has_nanos": {
"type": "boolean",
"script": "emit(doc['date'].value.nano != 0)"
}
},
"fields": [
{
"field": "date",
"format": "strict_date_optional_time_nanos"
},
{
"field": "date_has_nanos"
}
]
}
date フィールドはデフォルトのformat を使用します。 |
|
このドキュメントはプレーンな日付を使用しています。 | |
このドキュメントには時間が含まれています。 | |
このドキュメントはエポックからのミリ秒を使用しています。 | |
戻されるsort 値はすべて、ナノ秒からエポックまでのものです。 |
|
スクリプトで.nano を使用して、日付のナノ秒コンポーネントを返します。 |
|
データを取得する際に、fields パラメータを使用して形式を指定できます。ナノ秒の丸められた結果を得ることになります。 |
複数の日付形式を||
で区切って指定することもできます。date
フィールドと同じマッピングパラメータを使用できます。
日付ナノ秒は、{"date": 1618249875.123456}
のように小数点を含む数字を受け入れますが、いくつかのケース([#70085](https://github.com/elastic/elasticsearch/issues/70085))では、これらの日付の精度が失われるため、避けるべきです。
制限事項
集約は、date_nanos
フィールドを使用している場合でも、ミリ秒解像度のままです。この制限は、変換にも影響します。
合成_source
は、一般的にTSDBインデックス(index.mode
がtime_series
に設定されているインデックス)に対してのみ利用可能です。他のインデックスに対しては、合成_source
は技術プレビュー中です。技術プレビュー中の機能は、将来のリリースで変更または削除される可能性があります。Elasticは問題を修正するために取り組みますが、技術プレビュー中の機能は公式GA機能のサポートSLAの対象ではありません。
合成ソースは常に`````date_nanos`````フィールドをソートします。例えば:
#### Python
``````python
resp = client.indices.create(
index="idx",
mappings={
"_source": {
"mode": "synthetic"
},
"properties": {
"date": {
"type": "date_nanos"
}
}
},
)
print(resp)
resp1 = client.index(
index="idx",
id="1",
document={
"date": [
"2015-01-01T12:10:30.000Z",
"2014-01-01T12:10:30.000Z"
]
},
)
print(resp1)
`
Ruby
response = client.indices.create(
index: 'idx',
body: {
mappings: {
_source: {
mode: 'synthetic'
},
properties: {
date: {
type: 'date_nanos'
}
}
}
}
)
puts response
response = client.index(
index: 'idx',
id: 1,
body: {
date: [
'2015-01-01T12:10:30.000Z',
'2014-01-01T12:10:30.000Z'
]
}
)
puts response
Js
const response = await client.indices.create({
index: "idx",
mappings: {
_source: {
mode: "synthetic",
},
properties: {
date: {
type: "date_nanos",
},
},
},
});
console.log(response);
const response1 = await client.index({
index: "idx",
id: 1,
document: {
date: ["2015-01-01T12:10:30.000Z", "2014-01-01T12:10:30.000Z"],
},
});
console.log(response1);
コンソール
PUT idx
{
"mappings": {
"_source": { "mode": "synthetic" },
"properties": {
"date": { "type": "date_nanos" }
}
}
}
PUT idx/_doc/1
{
"date": ["2015-01-01T12:10:30.000Z", "2014-01-01T12:10:30.000Z"]
}
コンソール-結果
{
"date": ["2014-01-01T12:10:30.000Z", "2015-01-01T12:10:30.000Z"]
}