日付ナノ秒フィールドタイプ

このデータタイプは、dateデータタイプへの追加です。しかし、二つの間には重要な違いがあります。既存のdateデータタイプは、ミリ秒解像度で日付を保存します。date_nanosデータタイプは、ナノ秒解像度で日付を保存し、エポックからのナノ秒を表すロングとして日付が保存されるため、日付の範囲はおおよそ1970年から2262年までに制限されます。

ナノ秒に関するクエリは、内部的にこのロング表現の範囲クエリに変換され、集約の結果や保存されたフィールドは、フィールドに関連付けられた日付形式に応じて文字列に戻されます。

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

Js

  1. "strict_date_optional_time_nanos||epoch_millis"

例えば:

Python

  1. resp = client.indices.create(
  2. index="my-index-000001",
  3. mappings={
  4. "properties": {
  5. "date": {
  6. "type": "date_nanos"
  7. }
  8. }
  9. },
  10. )
  11. print(resp)
  12. resp1 = client.bulk(
  13. index="my-index-000001",
  14. refresh=True,
  15. operations=[
  16. {
  17. "index": {
  18. "_id": "1"
  19. }
  20. },
  21. {
  22. "date": "2015-01-01"
  23. },
  24. {
  25. "index": {
  26. "_id": "2"
  27. }
  28. },
  29. {
  30. "date": "2015-01-01T12:10:30.123456789Z"
  31. },
  32. {
  33. "index": {
  34. "_id": "3"
  35. }
  36. },
  37. {
  38. "date": 1420070400000
  39. }
  40. ],
  41. )
  42. print(resp1)
  43. resp2 = client.search(
  44. index="my-index-000001",
  45. sort={
  46. "date": "asc"
  47. },
  48. runtime_mappings={
  49. "date_has_nanos": {
  50. "type": "boolean",
  51. "script": "emit(doc['date'].value.nano != 0)"
  52. }
  53. },
  54. fields=[
  55. {
  56. "field": "date",
  57. "format": "strict_date_optional_time_nanos"
  58. },
  59. {
  60. "field": "date_has_nanos"
  61. }
  62. ],
  63. )
  64. print(resp2)

Ruby

  1. response = client.indices.create(
  2. index: 'my-index-000001',
  3. body: {
  4. mappings: {
  5. properties: {
  6. date: {
  7. type: 'date_nanos'
  8. }
  9. }
  10. }
  11. }
  12. )
  13. puts response
  14. response = client.bulk(
  15. index: 'my-index-000001',
  16. refresh: true,
  17. body: [
  18. {
  19. index: {
  20. _id: '1'
  21. }
  22. },
  23. {
  24. date: '2015-01-01'
  25. },
  26. {
  27. index: {
  28. _id: '2'
  29. }
  30. },
  31. {
  32. date: '2015-01-01T12:10:30.123456789Z'
  33. },
  34. {
  35. index: {
  36. _id: '3'
  37. }
  38. },
  39. {
  40. date: 1_420_070_400_000
  41. }
  42. ]
  43. )
  44. puts response
  45. response = client.search(
  46. index: 'my-index-000001',
  47. body: {
  48. sort: {
  49. date: 'asc'
  50. },
  51. runtime_mappings: {
  52. date_has_nanos: {
  53. type: 'boolean',
  54. script: "emit(doc['date'].value.nano != 0)"
  55. }
  56. },
  57. fields: [
  58. {
  59. field: 'date',
  60. format: 'strict_date_optional_time_nanos'
  61. },
  62. {
  63. field: 'date_has_nanos'
  64. }
  65. ]
  66. }
  67. )
  68. puts response

Js

  1. const response = await client.indices.create({
  2. index: "my-index-000001",
  3. mappings: {
  4. properties: {
  5. date: {
  6. type: "date_nanos",
  7. },
  8. },
  9. },
  10. });
  11. console.log(response);
  12. const response1 = await client.bulk({
  13. index: "my-index-000001",
  14. refresh: "true",
  15. operations: [
  16. {
  17. index: {
  18. _id: "1",
  19. },
  20. },
  21. {
  22. date: "2015-01-01",
  23. },
  24. {
  25. index: {
  26. _id: "2",
  27. },
  28. },
  29. {
  30. date: "2015-01-01T12:10:30.123456789Z",
  31. },
  32. {
  33. index: {
  34. _id: "3",
  35. },
  36. },
  37. {
  38. date: 1420070400000,
  39. },
  40. ],
  41. });
  42. console.log(response1);
  43. const response2 = await client.search({
  44. index: "my-index-000001",
  45. sort: {
  46. date: "asc",
  47. },
  48. runtime_mappings: {
  49. date_has_nanos: {
  50. type: "boolean",
  51. script: "emit(doc['date'].value.nano != 0)",
  52. },
  53. },
  54. fields: [
  55. {
  56. field: "date",
  57. format: "strict_date_optional_time_nanos",
  58. },
  59. {
  60. field: "date_has_nanos",
  61. },
  62. ],
  63. });
  64. console.log(response2);

コンソール

  1. PUT my-index-000001
  2. {
  3. "mappings": {
  4. "properties": {
  5. "date": {
  6. "type": "date_nanos"
  7. }
  8. }
  9. }
  10. }
  11. PUT my-index-000001/_bulk?refresh
  12. { "index" : { "_id" : "1" } }
  13. { "date": "2015-01-01" }
  14. { "index" : { "_id" : "2" } }
  15. { "date": "2015-01-01T12:10:30.123456789Z" }
  16. { "index" : { "_id" : "3" } }
  17. { "date": 1420070400000 }
  18. GET my-index-000001/_search
  19. {
  20. "sort": { "date": "asc"},
  21. "runtime_mappings": {
  22. "date_has_nanos": {
  23. "type": "boolean",
  24. "script": "emit(doc['date'].value.nano != 0)"
  25. }
  26. },
  27. "fields": [
  28. {
  29. "field": "date",
  30. "format": "strict_date_optional_time_nanos"
  31. },
  32. {
  33. "field": "date_has_nanos"
  34. }
  35. ]
  36. }
dateフィールドはデフォルトのformatを使用します。
このドキュメントはプレーンな日付を使用しています。
このドキュメントには時間が含まれています。
このドキュメントはエポックからのミリ秒を使用しています。
戻されるsort値はすべて、
ナノ秒からエポックまでのものです。
スクリプトで.nanoを使用して、日付のナノ秒コンポーネントを返します。
データを取得する際に、fieldsパラメータを使用して形式を指定できます。
ナノ秒の丸められた結果を得ることになります。

複数の日付形式を||で区切って指定することもできます。dateフィールドと同じマッピングパラメータを使用できます。

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

制限事項

集約は、date_nanosフィールドを使用している場合でも、ミリ秒解像度のままです。この制限は、変換にも影響します。

      • 合成 _source

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

  1. 合成ソースは常に`````date_nanos`````フィールドをソートします。例えば:
  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_nanos"
  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:30.000Z",
  24. "2014-01-01T12:10:30.000Z"
  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_nanos'
  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:30.000Z',
  23. '2014-01-01T12:10:30.000Z'
  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_nanos",
  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:30.000Z", "2014-01-01T12:10:30.000Z"],
  20. },
  21. });
  22. console.log(response1);

コンソール

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

次のようになります:

コンソール-結果

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