日付フィールドタイプ

JSONには日付データ型がないため、Elasticsearchの日時は次のいずれかになります:

  • フォーマットされた日付を含む文字列、例:"2015-01-01"または"2015/01/01 12:10:30"
  • エポックからのミリ秒を表す数値。
  • エポックからの秒を表す数値(設定)。

内部的には、日付はUTCに変換され(タイムゾーンが指定されている場合)、エポックからのミリ秒を表す長い数値として保存されます。

ナノ秒の解像度が期待される場合は、date_nanosフィールドタイプを使用してください。

日付に対するクエリは、内部的にこの長い表現に対する範囲クエリに変換され、集約の結果や保存されたフィールドは、フィールドに関連付けられた日付フォーマットに応じて文字列に戻されます。

日付は常に文字列として表示されます。たとえ最初にJSONドキュメントで長い数値として提供されていた場合でもです。

日付フォーマットはカスタマイズ可能ですが、formatが指定されていない場合はデフォルトが使用されます:

Js

  1. "strict_date_optional_time||epoch_millis"

これは、strict_date_optional_timeでサポートされているフォーマットまたはエポックからのミリ秒に準拠したオプションのタイムスタンプを持つ日付を受け入れることを意味します。

例えば:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "properties": {
  5. "date": {
  6. "type": "date"
  7. }
  8. }
  9. },
  10. )
  11. print(resp)
  12. resp1 = client.index(
  13. index="my-index-000001",
  14. id="1",
  15. document={
  16. "date": "2015-01-01"
  17. },
  18. )
  19. print(resp1)
  20. resp2 = client.index(
  21. index="my-index-000001",
  22. id="2",
  23. document={
  24. "date": "2015-01-01T12:10:30Z"
  25. },
  26. )
  27. print(resp2)
  28. resp3 = client.index(
  29. index="my-index-000001",
  30. id="3",
  31. document={
  32. "date": 1420070400001
  33. },
  34. )
  35. print(resp3)
  36. resp4 = client.search(
  37. index="my-index-000001",
  38. sort={
  39. "date": "asc"
  40. },
  41. )
  42. print(resp4)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. properties: {
  6. date: {
  7. type: 'date'
  8. }
  9. }
  10. }
  11. }
  12. )
  13. puts response
  14. response = client.index(
  15. index: 'my-index-000001',
  16. id: 1,
  17. body: {
  18. date: '2015-01-01'
  19. }
  20. )
  21. puts response
  22. response = client.index(
  23. index: 'my-index-000001',
  24. id: 2,
  25. body: {
  26. date: '2015-01-01T12:10:30Z'
  27. }
  28. )
  29. puts response
  30. response = client.index(
  31. index: 'my-index-000001',
  32. id: 3,
  33. body: {
  34. date: 1_420_070_400_001
  35. }
  36. )
  37. puts response
  38. response = client.search(
  39. index: 'my-index-000001',
  40. body: {
  41. sort: {
  42. date: 'asc'
  43. }
  44. }
  45. )
  46. puts response

Go

  1. {
  2. res, err := es.Indices.Create(
  3. "my-index-000001",
  4. es.Indices.Create.WithBody(strings.NewReader(`{
  5. "mappings": {
  6. "properties": {
  7. "date": {
  8. "type": "date"
  9. }
  10. }
  11. }
  12. }`)),
  13. )
  14. fmt.Println(res, err)
  15. }
  16. {
  17. res, err := es.Index(
  18. "my-index-000001",
  19. strings.NewReader(`{
  20. "date": "2015-01-01"
  21. } `),
  22. es.Index.WithDocumentID("1"),
  23. es.Index.WithPretty(),
  24. )
  25. fmt.Println(res, err)
  26. }
  27. {
  28. res, err := es.Index(
  29. "my-index-000001",
  30. strings.NewReader(`{
  31. "date": "2015-01-01T12:10:30Z"
  32. } `),
  33. es.Index.WithDocumentID("2"),
  34. es.Index.WithPretty(),
  35. )
  36. fmt.Println(res, err)
  37. }
  38. {
  39. res, err := es.Index(
  40. "my-index-000001",
  41. strings.NewReader(`{
  42. "date": 1420070400001
  43. } `),
  44. es.Index.WithDocumentID("3"),
  45. es.Index.WithPretty(),
  46. )
  47. fmt.Println(res, err)
  48. }
  49. {
  50. res, err := es.Search(
  51. es.Search.WithIndex("my-index-000001"),
  52. es.Search.WithBody(strings.NewReader(`{
  53. "sort": {
  54. "date": "asc"
  55. }
  56. }`)),
  57. es.Search.WithPretty(),
  58. )
  59. fmt.Println(res, err)
  60. }

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. properties: {
  5. date: {
  6. type: "date",
  7. },
  8. },
  9. },
  10. });
  11. console.log(response);
  12. const response1 = await client.index({
  13. index: "my-index-000001",
  14. id: 1,
  15. document: {
  16. date: "2015-01-01",
  17. },
  18. });
  19. console.log(response1);
  20. const response2 = await client.index({
  21. index: "my-index-000001",
  22. id: 2,
  23. document: {
  24. date: "2015-01-01T12:10:30Z",
  25. },
  26. });
  27. console.log(response2);
  28. const response3 = await client.index({
  29. index: "my-index-000001",
  30. id: 3,
  31. document: {
  32. date: 1420070400001,
  33. },
  34. });
  35. console.log(response3);
  36. const response4 = await client.search({
  37. index: "my-index-000001",
  38. sort: {
  39. date: "asc",
  40. },
  41. });
  42. console.log(response4);

コンソール

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "properties": {
  5. "date": {
  6. "type": "date"
  7. }
  8. }
  9. }
  10. }
  11. PUT my-index-000001/_doc/1
  12. { "date": "2015-01-01" }
  13. PUT my-index-000001/_doc/2
  14. { "date": "2015-01-01T12:10:30Z" }
  15. PUT my-index-000001/_doc/3
  16. { "date": 1420070400001 }
  17. GET my-index-000001/_search
  18. {
  19. "sort": { "date": "asc"}
  20. }
dateフィールドはデフォルトのformatを使用します。
このドキュメントはプレーンな日付を使用しています。
このドキュメントには時間が含まれています。
このドキュメントはエポックからのミリ秒を使用しています。
返されるsortの値はすべてエポックからのミリ秒です。

日付は{"date": 1618249875.123456}のように小数点を含む数値を受け入れますが、いくつかのケース([#70085](https://github.com/elastic/elasticsearch/issues/70085))では、これらの日付の精度が失われるため、避けるべきです。

複数の日付フォーマット

複数のフォーマットは、||を区切りとして指定できます。各フォーマットは、マッチするフォーマットが見つかるまで順番に試されます。最初のフォーマットがエポックからのミリ秒値を文字列に戻すために使用されます。

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "properties": {
  5. "date": {
  6. "type": "date",
  7. "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
  8. }
  9. }
  10. },
  11. )
  12. print(resp)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. properties: {
  6. date: {
  7. type: 'date',
  8. format: 'yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis'
  9. }
  10. }
  11. }
  12. }
  13. )
  14. 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. "date": {
  7. "type": "date",
  8. "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
  9. }
  10. }
  11. }
  12. }`)),
  13. )
  14. fmt.Println(res, err)

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. properties: {
  5. date: {
  6. type: "date",
  7. format: "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis",
  8. },
  9. },
  10. },
  11. });
  12. console.log(response);

コンソール

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "properties": {
  5. "date": {
  6. "type": "date",
  7. "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
  8. }
  9. }
  10. }
  11. }

日付フィールドのパラメータ

次のパラメータは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 フィールドに関するメタデータ。

エポック秒

日付をエポックからの秒として送信する必要がある場合は、formatepoch_secondをリストしていることを確認してください:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "properties": {
  5. "date": {
  6. "type": "date",
  7. "format": "strict_date_optional_time||epoch_second"
  8. }
  9. }
  10. },
  11. )
  12. print(resp)
  13. resp1 = client.index(
  14. index="my-index-000001",
  15. id="example",
  16. refresh=True,
  17. document={
  18. "date": 1618321898
  19. },
  20. )
  21. print(resp1)
  22. resp2 = client.search(
  23. index="my-index-000001",
  24. fields=[
  25. {
  26. "field": "date"
  27. }
  28. ],
  29. source=False,
  30. )
  31. print(resp2)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. properties: {
  6. date: {
  7. type: 'date',
  8. format: 'strict_date_optional_time||epoch_second'
  9. }
  10. }
  11. }
  12. }
  13. )
  14. puts response
  15. response = client.index(
  16. index: 'my-index-000001',
  17. id: 'example',
  18. refresh: true,
  19. body: {
  20. date: 1_618_321_898
  21. }
  22. )
  23. puts response
  24. response = client.search(
  25. index: 'my-index-000001',
  26. body: {
  27. fields: [
  28. {
  29. field: 'date'
  30. }
  31. ],
  32. _source: false
  33. }
  34. )
  35. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. properties: {
  5. date: {
  6. type: "date",
  7. format: "strict_date_optional_time||epoch_second",
  8. },
  9. },
  10. },
  11. });
  12. console.log(response);
  13. const response1 = await client.index({
  14. index: "my-index-000001",
  15. id: "example",
  16. refresh: "true",
  17. document: {
  18. date: 1618321898,
  19. },
  20. });
  21. console.log(response1);
  22. const response2 = await client.search({
  23. index: "my-index-000001",
  24. fields: [
  25. {
  26. field: "date",
  27. },
  28. ],
  29. _source: false,
  30. });
  31. console.log(response2);

コンソール

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "properties": {
  5. "date": {
  6. "type": "date",
  7. "format": "strict_date_optional_time||epoch_second"
  8. }
  9. }
  10. }
  11. }
  12. PUT my-index-000001/_doc/example?refresh
  13. { "date": 1618321898 }
  14. POST my-index-000001/_search
  15. {
  16. "fields": [ {"field": "date"}],
  17. "_source": false
  18. }

次のような日付が返されます:

コンソール-結果

  1. {
  2. "hits": {
  3. "hits": [
  4. {
  5. "_id": "example",
  6. "_index": "my-index-000001",
  7. "_score": 1.0,
  8. "fields": {
  9. "date": ["2021-04-13T13:51:38.000Z"]
  10. }
  11. }
  12. ]
  13. }
  14. }

合成 _source

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

  1. 合成ソースは常に`````date`````フィールドをソートします。例えば:
  2. #### Python
  3. ``````python
  4. resp = client.indices.create(
  5. index="idx",
  6. mappings={
  7. "_source": {
  8. "mode": "synthetic"
  9. },
  10. "properties": {
  11. "date": {
  12. "type": "date"
  13. }
  14. }
  15. },
  16. )
  17. print(resp)
  18. resp1 = client.index(
  19. index="idx",
  20. id="1",
  21. document={
  22. "date": [
  23. "2015-01-01T12:10:30Z",
  24. "2014-01-01T12:10:30Z"
  25. ]
  26. },
  27. )
  28. print(resp1)
  29. `

Ruby

  1. response = client.indices.create(
  2. index: 'idx',
  3. body: {
  4. mappings: {
  5. _source: {
  6. mode: 'synthetic'
  7. },
  8. properties: {
  9. date: {
  10. type: 'date'
  11. }
  12. }
  13. }
  14. }
  15. )
  16. puts response
  17. response = client.index(
  18. index: 'idx',
  19. id: 1,
  20. body: {
  21. date: [
  22. '2015-01-01T12:10:30Z',
  23. '2014-01-01T12:10:30Z'
  24. ]
  25. }
  26. )
  27. puts response

Js

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

コンソール

  1. PUT idx
  2. {
  3. "mappings": {
  4. "_source": { "mode": "synthetic" },
  5. "properties": {
  6. "date": { "type": "date" }
  7. }
  8. }
  9. }
  10. PUT idx/_doc/1
  11. {
  12. "date": ["2015-01-01T12:10:30Z", "2014-01-01T12:10:30Z"]
  13. }

次のようになります:

コンソール-結果

  1. {
  2. "date": ["2014-01-01T12:10:30.000Z", "2015-01-01T12:10:30.000Z"]
  3. }