Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Mapping ›Типы данных полей

Тип поля Date nanoseconds

Этот тип данных является дополнением к типу date. Однако существует важное различие между ними. Существующий тип date хранит даты с разрешением в миллисекунды. Тип date_nanos хранит даты с разрешением в наносекунды, что ограничивает диапазон дат примерно с 1970 по 2262 год, так как даты всё ещё хранятся как целое число, представляющее наносекунды с момента эпохи.

Запросы к наносекундам внутри преобразуются в запросы диапазона к этому целочисленному представлению, а результат агрегаций и сохранённых полей преобразуется обратно в строку в зависимости от формата даты, связанного с полем.

Форматы дат можно настроить, но если format не указан, используется значение по умолчанию:

    "strict_date_optional_time_nanos||epoch_millis"

Например:

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)
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
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. Используйте strict_date_optional_time_nanos, иначе результат будет округлен.

Вы также можете указать несколько форматов дат, разделенных ||. Можно использовать те же параметры сопоставления, что и для поля date.

Date nanoseconds будет принимать числа с десятичной точкой, например, {"date": 1618249875.123456}, но в некоторых случаях (#70085) точность этих дат может быть потеряна, поэтому следует избегать их использования.

Ограничения

Агрегации по-прежнему выполняются с разрешением в миллисекунды, даже при использовании поля date_nanos. Это ограничение также влияет на преобразования.


Синтетическое _source

Синтетическое _source доступно только для индексов TSDB (индексы, у которых index.mode установлено в значение time_series). Для других индексов синтетическое _source находится в стадии технического предварительного просмотра. Функции в стадии технического предварительного просмотра могут быть изменены или удалены в будущих выпусках. Elastic будет работать над исправлением любых проблем, но функции в стадии технического предварительного просмотра не подпадают под SLA поддержки официальных функций GA.

Синтетический источник может сортировать значения поля date_nanos. Например:

resp = client.indices.create(
    index="idx",
    settings={
        "index": {
            "mapping": {
                "source": {
                    "mode": "synthetic"
                }
            }
        }
    },
    mappings={
        "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)
const response = await client.indices.create({
  index: "idx",
  settings: {
    index: {
      mapping: {
        source: {
          mode: "synthetic",
        },
      },
    },
  },
  mappings: {
    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
{
  "settings": {
    "index": {
      "mapping": {
        "source": {
          "mode": "synthetic"
        }
      }
    }
  },
  "mappings": {
    "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"]
}

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/date_nanos.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API