Тип поля Дата
В JSON нет типа данных дата, поэтому даты в Elasticsearch могут быть представлены:
- строками с отформатированными датами, например
"2015-01-01"или"2015/01/01 12:10:30". - числом, представляющим количество миллисекунд с начала эпохи.
- числом, представляющим количество секунд с начала эпохи (настройки).
Внутри Elasticsearch даты преобразуются в UTC (если указана зона времени) и хранятся в виде целого числа, представляющего количество миллисекунд с начала эпохи.
Используйте тип поля date_nanos, если требуется разрешение до наносекунд.
Запросы к датам внутренне преобразуются в запросы диапазона на этом целочисленном представлении, а результат агрегаций и сохранённых полей преобразуется обратно в строку в зависимости от формата даты, связанного с полем.
Даты всегда будут отображаться как строки, даже если они были изначально заданы как целые числа в JSON-документе.
Форматы дат можно настроить, но если format не указан, используется значение по умолчанию:
"strict_date_optional_time||epoch_millis"
Это означает, что он будет принимать даты с необязательными метками времени, соответствующие форматам, поддерживаемым strict_date_optional_time или миллисекундам с начала эпохи.
Например:
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) 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 {
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)
} 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": 1618249875.123456}, но в некоторых случаях (#70085) точность таких дат будет потеряна, поэтому следует избегать их использования.
Текстовые строки, принимаемые текстовыми форматами дат и вычислениями для дат недели, зависят от версии JDK, на которой работает Elasticsearch. Дополнительную информацию см. в разделе настраиваемые форматы дат.
Несколько форматов дат
Несколько форматов можно указать, разделив их ||. Каждый формат будет проверяться по очереди до тех пор, пока не будет найден соответствующий формат. Первый формат будет использоваться для преобразования значения миллисекунд с начала эпохи в строку.
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) 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 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) 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
Следующие параметры принимаются полями date:
| Необходимо ли хранить поле на диске в виде столбцов, чтобы его можно было использовать для сортировки, агрегаций или скриптов? Принимает | |
| Формат(ы) дат, которые можно проанализировать. По умолчанию | |
| | Язык для анализа дат, поскольку названия и/или аббревиатуры месяцев отличаются в разных языках. По умолчанию АНГЛИЙСКИЙ. |
| Если | |
| Должно ли поле быть быстро находимым в результатах поиска? Принимает | |
| Принимает значение даты из одного из настроенных | |
| | Определяет, что делать, если скрипт, определённый параметром |
| | Если этот параметр установлен, поле будет индексировать значения, сгенерированные этим скриптом, а не читать значения напрямую из исходных данных. Если для этого поля задано значение в входном документе, документ будет отклонен с ошибкой. Скрипты имеют тот же формат, что и их аналогичные скрипты, и должны генерировать значения времени в формате целых чисел. |
| Необходимо ли сохранять значение поля отдельно от поля | |
| Метаданные о поле. |
Секунды эпохи
Если вам нужно отправлять даты как секунды с начала эпохи, убедитесь, что format содержит epoch_second:
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) 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 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.
Синтетические исходные данные могут сортировать значения поля date. Например:
resp = client.indices.create(
index="idx",
settings={
"index": {
"mapping": {
"source": {
"mode": "synthetic"
}
}
}
},
mappings={
"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) const response = await client.indices.create({
index: "idx",
settings: {
index: {
mapping: {
source: {
mode: "synthetic",
},
},
},
},
mappings: {
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
{
"settings": {
"index": {
"mapping": {
"source": {
"mode": "synthetic"
}
}
}
},
"mappings": {
"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"]
}
© 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.html